问题:我无法使用完全相同的内容(在一台机器上或在git repo中构建某些东西的CI集群中)复制docker层
考虑这个简单的例子
$ echo "test file" > test.txt
$ cat > Dockerfile <<EOF
FROM alpine:3.8
COPY test.txt /test.txt
EOF
如果我在一台启用了缓存的计算机上构建映像,则复制了文件的最后一层将在映像之间共享
$ docker build -t test:1 .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM alpine:3.8
3.8: Pulling from library/alpine
cd784148e348: Already exists
Digest: sha256:46e71df1e5191ab8b8034c5189e325258ec44ea739bba1e5645cff83c9048ff1
Status: Downloaded newer image for alpine:3.8
---> 3f53bb00af94
Step 2/2 : COPY test.txt /test.txt
---> decab6a3fbe3
Successfully built decab6a3fbe3
Successfully tagged test:1
$ docker build -t test:2 .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM alpine:3.8
---> 3f53bb00af94
Step 2/2 : COPY test.txt /test.txt
---> Using cache
---> decab6a3fbe3
Successfully built decab6a3fbe3
Successfully tagged test:2
但是在禁用缓存(或只是使用另一台计算机)的情况下,我得到了不同的哈希值。
$ docker build -t test:3 --no-cache .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM alpine:3.8
---> 3f53bb00af94
Step 2/2 : COPY test.txt /test.txt
---> ced4dff22d62
Successfully built ced4dff22d62
Successfully tagged test:3
同时,history命令显示文件内容相同
$ docker history test:1
IMAGE CREATED CREATED BY SIZE COMMENT
decab6a3fbe3 6 minutes ago /bin/sh -c #(nop) COPY file:d9210c40895e
$ docker history test:3
IMAGE CREATED CREATED BY SIZE COMMENT
ced4dff22d62 27 seconds ago /bin/sh -c #(nop) COPY file:d9210c40895e
我是否缺少某些东西,或者这种行为是设计使然?
是否有任何技术可以获取可复制/可重复使用的图层,而不会迫使我执行以下任一操作
最终,这个问题使我无法通过不断更改应用程序代码来获得薄层,同时将依赖项的各层保持在独立且不经常更改的层中。
答案 0 :(得分:1)
经过一些额外的搜索,我发现a great post描述了此问题的解决方案。
从1.13开始,泊坞窗具有--cache-from
选项,可用于告诉泊坞窗查看另一层图像。重要的是-必须明确拉出图像以使其正常工作+您仍然需要指出要拍摄的图像。可能是latest
或您拥有的任何其他“滚动”图像。
遗憾的是,无法在“隔离”中生成相同的层,但是cache-from
解决了根本问题-如何最终在ci构建期间重用某些层。