我正在使用 vgo 和 Dockerfile 开发一个 go 项目,我希望 docker 缓存项目的依赖项,使其具有两个属性:
- 如果
go.mod
文件发生更改,将重新下载依赖项 - 如果我更改了包中的文件,但不更改
go.mod
,则不会重新下载依赖项。
现在,我这样做:
...
RUN go get -u golang.org/x/vgo
COPY . /go/src/whatever
RUN vgo install
...
但是如果你改变了一个 go 文件,dockerfile 必须从COPY
层开始重建。
简而言之,我想做的是:
...
RUN go get -u golang.org/x/vgo
COPY go.mod /go/src/whatever
RUN vgo install_dependencies
COPY . /go/src/whatever
RUN vgo install
...
这样,如果我更改go.mod
,所有依赖项都将被下载并重建,否则,我们可以继续构建二进制文件。
我可以看到几种获得这种行为的方法,但它们都有缺点:
- 我可以复制
$GOPATH/src/mod
到 docker 容器中,但这会有很多我不需要的文件 - 我可以
vgo mod -vendor
在构建 docker 容器之前复制供应商目录,但这依赖于开发人员记住vgo mod -vendor
每次go.mod
更改时都要运行,否则应用程序将无法构建,他们必须vgo mod -vendor
在重试 docker 构建之前运行。
你能想出一种方法让我得到像我想象的那样的行为vgo install_dependencies
吗?我是否错过了这样做的 vgo 技巧?