在不同主机上获取可复制的docker层
问题:我无法使用完全相同的内容复制docker层(在一台机器上或在CI集群中,其中某些内容是从git repo构建的) 考虑这个简单的例子在不同主机上获取可复制的docker层,docker,dockerfile,Docker,Dockerfile,问题:我无法使用完全相同的内容复制docker层(在一台机器上或在CI集群中,其中某些内容是从git repo构建的) 考虑这个简单的例子 $ echo "test file" > test.txt $ cat > Dockerfile <<EOF FROM alpine:3.8 COPY test.txt /test.txt EOF 但是当缓存被禁用(或者只是使用另一台机器)时,我得到了不同的哈希值 $ docker build -t test:3 --no-cac
$ echo "test file" > test.txt
$ cat > Dockerfile <<EOF
FROM alpine:3.8
COPY test.txt /test.txt
EOF
但是当缓存被禁用(或者只是使用另一台机器)时,我得到了不同的哈希值
$ 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
是我遗漏了什么,还是这种行为是故意的
是否有任何技术可以获得可复制/可重复使用的图层,而不会迫使我执行以下操作之一
最终,这个问题使我无法通过不断变化的应用程序代码来获得精简层,同时将依赖项的各个层保持在单独且不经常变化的层中 通过谷歌搜索,我找到了这个问题的解决方案 从1.13开始,docker有
--cache from
选项,可用于告诉docker查看另一个图层图像。重要的事情-图像应该被明确地拉出来,这样它才能工作+你仍然需要点什么图像来拍摄。它可以是最新的
或您拥有的任何其他“滚动”图像
考虑到这一点,不幸的是,没有办法“隔离”地生成相同的层,但是
缓存从
解决了根本问题-如何最终在ci构建期间重用某些层。如果运行docker测试:1-f'{{.RootFS.layers}
和docker检查测试:3-f'{.RootFS.layers}
,你看到区别了吗?@OliverCharlesworth没有,相同的输出如果你在创建新图像之前从注册表中提取图像会怎么样?它应该加载和缓存当前状态,并重用常见的层,不是吗?而不是依赖缓存。问题是,--cache from
也需要提取一个图像。我没有检查它,但怀疑在一个新的agent 2上,不相关的映像将不会重用缓存,这仅适用于生成相同的映像。问题是缓存只检查上下文的内容,而不能检查任何外部资源。因此,如果您跨多个步骤使用它,例如,apt get install-y something
,它将使用现有层,而不会检查包的更新版本。
$ 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