Dan*_*ial 5 go docker dockerfile go-modules docker-buildkit
我读过一些文章,其中建议有一个专用go mod download
层来下载 go 依赖项。据我所知,该层已被缓存,如果依赖项在下一个构建中没有更改,则将使用缓存的层,从而节省我们的时间。我还注意到,使用 BuildKit 安装功能,go build
二进制结果缓存在GO env GOCACHE
目录中,以便用于将来的构建。
现在的情况是,很多时候只有少数 go 依赖项发生了变化,因此缓存go mod download
层失效了。因此,在下一个构建中,所有依赖项都将再次下载,即使只有其中少数发生了变化。我的问题是是否可以挂载下载的包(依赖项)?这样做的缺点是什么?我还没有看到 Go Dockerfile 最佳实践中使用了这种技术。就像是
RUN --mount=type=cache,target=/go/pkg/mod go mod download
Run Code Online (Sandbox Code Playgroud)
小智 6
我认为你可以开始这样做然后看看。对我来说,如果我必须使用这个,我会选择不同的挂载路径,只是为了隔离本地环境。
RUN --mount=type=cache,target=/Users/me/Library/Caches go mod download
Run Code Online (Sandbox Code Playgroud)
我没有发现安装下载的软件包有任何问题。在此示例中,它用于apt
.
然而,我认为我们也可以退后一步,考虑不同的方法,以免被等待 Docker 构建所困扰。
我们可以安排构建(每晚构建等),我认为没有任何理由如此频繁地进行本地 docker 构建,尤其是您的依赖项不应该经常更改。也许我错了,但我认为我们没有必要这样做。
我们还可以进一步分解go mod download
和利用 Docker 构建缓存,例如
RUN go mod download package-never-change
RUN go mod download package-changes-frequently
Run Code Online (Sandbox Code Playgroud)
甚至
RUN go build ./package1
RUN go build ./package2
Run Code Online (Sandbox Code Playgroud)
它可能看起来有点乏味,但在某些情况下它可能很有用,例如,当不支持 BuildKit 时。
归档时间: |
|
查看次数: |
4120 次 |
最近记录: |