使用Docker Buildkit构建映像时--cache-from参数的顺序是否重要?

时间:2020-07-13 02:56:45

标签: docker caching docker-buildkit

假设我正在使用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目标时,我想通过拉入远程some-expensive-base-image映像作为缓存来尝试在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的{​​{1}}参数的顺序重要吗?

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

是否有机会在运行脚本中的docker build命令之前尝试docker pull这两个图像?

此外,我知道我在示例中提到了Docker Hub,但实际上,我的应用程序将AWS ECR用于其远程Docker存储库。 Buildkit的正常功能是否重要?

1 个答案:

答案 0 :(得分:0)

是的,--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很有用。