我读过一些文章,其中建议使用专用的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
我认为安装下载的软件包没有任何问题。在本例中,它用于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时。