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

在不同主机上获取可复制的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

问题:我无法使用完全相同的内容复制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-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
是我遗漏了什么,还是这种行为是故意的

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

  • 跨计算机共享docker缓存
  • 在构建下一个之前,请先拖动“上一个”图像

  • 最终,这个问题使我无法通过不断变化的应用程序代码来获得精简层,同时将依赖项的各个层保持在单独且不经常变化的层中

    通过谷歌搜索,我找到了这个问题的解决方案

    从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