在不同主机上获取可复制的Docker层

时间:2018-12-29 19:43:35

标签: docker dockerfile

问题:我无法使用完全相同的内容(在一台机器上或在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

我是否缺少某些东西,或者这种行为是设计使然?

是否有任何技术可以获取可复制/可重复使用的图层,而不会迫使我执行以下任一操作

  1. 跨机器共享docker缓存
  2. 先绘制“上一个”图像,然后再构建下一个

最终,这个问题使我无法通过不断更改应用程序代码来获得薄层,同时将依赖项的各层保持在独立且不经常更改的层中。

1 个答案:

答案 0 :(得分:1)

经过一些额外的搜索,我发现a great post描述了此问题的解决方案。

从1.13开始,泊坞窗具有--cache-from选项,可用于告诉泊坞窗查看另一层图像。重要的是-必须明确拉出图像以使其正常工作+您仍然需要指出要拍摄的图像。可能是latest或您拥有的任何其他“滚动”图像。

遗憾的是,无法在“隔离”中生成相同的层,但是cache-from解决了根本问题-如何最终在ci构建期间重用某些层。