4

假设我正在使用 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:latest构建目标时拉入远程映像作为缓存来尝试节省我的 CI 管道上的构建时间some-expensive-base-image。而且,我想同时提取刚刚构建的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 pull两个图像吗?docker build

另外,我知道我在示例中提到了 Docker Hub,但在现实生活中,我的应用程序使用 AWS ECR 作为其远程 Docker 存储库。这对适当的 Buildkit 功能有影响吗?

4

1 回答 1

1

是的,--cache-from事情的顺序!

请参阅实现该功能的人在 Github 上的解释,在此处引用:

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

我过去也遇到过类似的问题,您可能会发现检查这个答案很有用,我在其中分享了关于在 CI 中使用 Docker 缓存的信息

于 2021-06-22T07:35:58.047 回答