【问题标题】:Does the order of --cache-from arguments matter when building an image with Docker Buildkit?使用 Docker Buildkit 构建映像时 --cache-from 参数的顺序是否重要?
【发布时间】:2020-11-02 05:18:39
【问题描述】:

假设我正在使用 Docker Buildkit 构建映像。我的图像来自多级 Dockerfile,如下所示:

FROM node:12 AS some-expensive-base-image
...

FROM some-expensive-base-image AS my-app
...

我现在正在尝试构建这两个图像。假设我将这些推送到 Docker Hub。如果我要使用 Docker Buildkit 的外部缓存功能,那么我想通过在构建 some-expensive-base-image 目标时拉入远程 some-expensive-base-image:latest 图像作为缓存来尝试节省我的 CI 管道上的构建时间。而且,我想同时拉入刚刚构建的some-expensive-base-image 图像和远程my-app:latest 图像作为后一个图像的缓存。我相信我需要两者,以防止需要重建 some-expensive-base-image 的步骤,因为......嗯......它们很昂贵。

这是我的构建脚本的样子:

export DOCKER_BUILDKIT=1
docker build --build-arg BUILDKIT_INLINE_CACHE=1 --cache-from some-expensive-base-image:latest --target some-expensive-base-image -t some-expensive-base-image:edge .
docker build --build-arg BUILDKIT_INLINE_CACHE=1 --cache-from some-expensive-base-image:edge --cache-from my-app:latest --target my-app -t my-app:edge .

我的问题:--cache-from 参数的顺序对第二个docker build 是否重要?

我在此构建的 CI 管道上得到了不一致的结果。在构建后一个映像时会发生缓存未命中,即使没有任何会导致缓存破坏的代码更改。可以毫无问题地拉出 Cache Minefest。有时会拉取缓存映像,但有时需要重新运行后一个目标的所有步骤。我不知道为什么。

是否应该在我的脚本中运行 docker build 命令之前尝试 docker pull 两个图像?

另外,我知道我在示例中提到了 Docker Hub,但在现实生活中,我的应用程序使用 AWS ECR 作为其远程 Docker 存储库。这对于正确的 Buildkit 功能是否重要?

【问题讨论】:

    标签: docker caching docker-buildkit


    【解决方案1】:

    是的,--cache-from 的顺序很重要!

    the explanation on Github from the person who implemented the feature,在此引用:

    当使用多个 --cache-from 时,会按照用户指定的顺序检查缓存命中。如果其中一个图像对命令产生缓存命中,则仅该图像用于构建的其余部分。

    我过去也遇到过类似的问题,您可能会发现 check ths answer, where I've shared about using Docker cache in the CI 有用。

    【讨论】:

    • 感谢您的回复。自从我发布这篇文章以来,我已经换了雇主,所以我不再从事我个人维护 Docker 构建的项目。但无论如何,当时我的团队发现带有--cache-from 的 Docker Buildkit 缓存功能过于繁琐和错误,因此我们放弃了使用该 arg 进行构建。
    • 另外,--cache-from 功能作者的回答来自 2017 年,大约 4 年前。从那时起,行为(特别是,如果在本地缓存中找不到图像,Docker 是否会拉取)很有可能发生了变化。
    猜你喜欢
    • 1970-01-01
    • 2019-07-01
    • 2022-07-15
    • 2016-05-18
    • 1970-01-01
    • 2023-02-16
    • 2016-10-13
    • 2022-12-14
    • 1970-01-01
    相关资源
    最近更新 更多