gpt4 book ai didi

docker - 如何使用 vgo 和给定的 go.mod 下载所有依赖项?

转载 作者:IT老高 更新时间:2023-10-28 21:22:45 25 4
gpt4 key购买 nike

我正在开发一个使用 vgo 和 Dockerfile 的 go 项目,我希望 docker 缓存项目的依赖项,使其具有两个属性:

  1. 如果go.mod文件发生变化,依赖会重新下载
  2. 如果我更改包中的文件,但不更改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,所有依赖项都将被下载并重新构建,否则,我们可以继续构建二进制文件。

我可以看到几种获得这种行为的方法,但它们都有缺点:

  1. 我可以将 $GOPATH/src/mod 复制到 docker 容器中,但这会有很多我不需要的文件
  2. 我可以在构建 docker 容器之前 vgo mod -vendor 并复制 vendor 目录,但这依赖于开发人员记住运行 vgo mod -vendor每次 go.mod 更改时,否则应用程序将无法构建,他们必须在重试 docker 构建之前运行 vgo mod -vendor

你能想出一种方法让我获得像我想象中的 vgo install_dependencies 这样的行为吗?我是否错过了这样做的 vgo 技巧?

最佳答案

tl;dr:在当前的 go master 和 future 的 go 版本中,go mod download 将完成这项工作。现在你需要一个 hack。

在 gophers slack 上,我被提到了这个问题:https://github.com/golang/go/issues/26610我了解到这或多或少会做我想要的(假设您使用的是 go 版本 1.11beta3):

# Populate the module cache based on the go.{mod,sum} files.
COPY go.mod .
COPY go.sum .
RUN go list -e $(go list -f '{{.Path}}' -m all)

在线程的后面,Russ Cox 实现了 go mod download,它将在 go 的下一版本中提供,让我可以删除愚蠢的 go列出上面的hack。

更新:go mod 下载现已广泛使用,您应该在 go 1.12 及更高版本上使用它

关于docker - 如何使用 vgo 和给定的 go.mod 下载所有依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51126349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com