如何设置docker在每个构建步骤中使用注册表中的缓存



我有两台带有docker的服务器和一台带有私人注册表的服务器。

我在第一台机器上构建了Dockerfile;然后我把图像推送到注册表。

是否可以立即使用注册表中的缓存在第二台机器上构建Dockerfile?如果没有,有没有办法在不写自己的缓存的情况下加快构建"几乎"相同的Dockerfiles?

它试图设置--registry-mirror,但没有帮助。

注意:问题20316("提取构建缓存")已关闭,因为PR 26839("基于历史数组实现构建缓存")已合并。

例如,它允许在--cache-from中指定以前CI构建的映像。

添加了在生成时指定用作缓存源的图像的功能。这些映像不需要具有本地父链,并且可以从其他注册表中提取。用户需要确保仅使用受信任的图像作为源。

用法:

docker pull myimage:v1.0
docker build --cache-from myimage:v1.0 -t myimage:v1.1 .

参见合并提交7944480,docker 1.13(2017年1月)。

javipolo:所述

如果有人像我一样疯狂地重复使用层;技巧";是将正在重建的图像(并且已经将其提取)传递给--cache-from,并且还将其用作FROM中基础的图像传递给。

示例:
Dockerfile用于图像custom-gource:0.1

FROM base_image:2.2.1
RUN apt-get update && apt-get install gource
COPY myscript.sh /myscript.sh

为了在其他主机中重建而不需要再次执行apt-get,您需要:

docker pull custom-gource:0.1
docker build --cache-from=base_image:2.2.1,custom-gource:0.1 . -t custom-gource:0.2

这可能看起来太明显了,但我已经为此挣扎了很长时间,直到我知道你需要包括基础图像太

对于docker>1.10,我发现了一些关于这个问题的东西:https://github.com/docker/docker/issues/20316#issuecomment-221289631

考虑到这个Dockerfile

FROM busybox
RUN mkdir this-is-a-test
RUN echo "hello world"

运行docker build -t caching-test .

然后我们可以用docker history caching-test看到包含图像的层

3e4a484f0e67        About an hour ago   /bin/sh -c echo "Hello world!"                  0 B                 
6258cdec0c4b        About an hour ago   /bin/sh -c mkdir this-is-a-test                 0 B                 
47bcc53f74dc        9 weeks ago         /bin/sh -c #(nop) CMD ["sh"]                    0 B                 
<missing>           9 weeks ago         /bin/sh -c #(nop) ADD file:47ca6e777c36a4cfff   1.113 MB  

1.11中对保存/加载的更改保留了父层和子层之间的关系,但仅当它们通过docker保存一起保存时。我们可以通过运行docker inspect test | grep Parent.来查看最终测试图像的父图像

$ docker inspect caching-test | grep Parent
"Parent": "sha256:6258cdec0c4bef5e5627f301b541555883e6c4b385d0798a7763cb191168ce09", 

这是Docker历史输出的第二个顶层。

为了使用保存和加载重新创建缓存,您需要保存出作为父对象引用的所有图像和层。在实践中,这通常意味着您需要在同一命令中保存每个层以及FROM图像。

docker save caching-test 6258cdec0c4b busybox > caching-test.tar——请注意,我们还可以为save命令指定图层名称,而不是ID。

让我们清除所有内容,然后从tar文件中重新加载图像。docker rmi $(docker images -q)。确认不存在图像。

然后运行docker load -i caching-test.tar。如果您查看这些图像,您将看到busybox,然后是缓存测试。运行docker history caching-test将显示与最初构建图像时完全相同的输出。这是因为父/子关系是通过保存和加载来保留的。您甚至可以运行docker inspect caching-test | grep Parent,并看到与父层完全相同的ID。

运行同一Dockerfile的重建会显示缓存正在使用。

Sending build context to Docker daemon 5.391 MB
Step 1 : FROM busybox
---> 47bcc53f74dc
Step 2 : RUN mkdir this-is-a-test
---> Using cache
---> 6258cdec0c4b
Step 3 : RUN echo "hello world"
---> Using cache
---> 3e4a484f0e67
Successfully built 3e4a484f0e67

编辑:以下仅适用docker 1.10之前

在第二台机器上,您可以在构建新机器之前docker pull theimagefromthefirstdockerfileontheregistry

这样你就可以确保每一层都出现在第二台机器上。

docker引擎不会在每次构建一个层时查询注册表(它甚至不知道),它会太慢/太重,所以我认为没有其他方法。

对于Docker版本>=19.03,您可以使用新的BuildKit功能来避免在构建之前提取远程映像。通过设置DOCKER_BuildKit环境变量激活BuildKit,然后打开内联缓存,使用BuildKit_inline_ACHE构建参数将构建缓存与图像一起存储在注册表中,如下所示:

export DOCKER_BUILDKIT=1
docker build -t registry/imagename:tag --cache-from registry/imagename:tag --build-arg BUILDKIT_INLINE_CACHE=1 .
docker push registry/imagename:tag

感谢Nicholas Dille提供的解决方案。

您还可以切换到谷歌解决方案kaniko

https://cloud.google.com/build/docs/kaniko-cache#kaniko-构建

最新更新