在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

我认为安装下载的软件包没有任何问题。在本例中,它用于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时。

最新更新