登录
首页 >  Golang >  Go问答

在 Docker 中缓存 Go 依赖项

来源:stackoverflow

时间:2024-04-07 12:00:36 182浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《在 Docker 中缓存 Go 依赖项》,聊聊,希望可以帮助到正在努力赚钱的你。

问题内容

我读过一些文章,建议使用专用的 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 --mount=type=cache,target=/users/me/library/caches go mod download

我没有发现安装下载的软件包有任何问题。在这个example中,用于apt

但是,我认为我们也可以退后一步,考虑不同的方法,以免因等待 docker 构建而烦恼。

我们可以安排构建(每晚构建等),我认为没有任何理由如此频繁地进行本地 docker 构建,尤其是您的依赖项不应该经常更改。也许我错了,但我认为我们不需要这样做。

我们还可以进一步分解 go mod download 并利用 docker 构建缓存 例如

run go mod download package-never-change
run go mod download package-changes-frequently

均匀

RUN go build ./package1
RUN go build ./package2

它可能看起来有点乏味,但在某些情况下它可能很有用,例如,当不支持 buildkit 时。

到这里,我们也就讲完了《在 Docker 中缓存 Go 依赖项》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>