什么是docker中间层或映像?

时间:2020-03-21 18:38:46

标签: docker

intermediate image在Docker文档中被多次提及,

只有RUN,COPY,ADD指令创建图层。其他说明会创建临时的中间图像,并且不会增加构建的大小。

ENV部分中,它提到了中间层

每条ENV行都会创建一个新的中间层,就像RUN命令一样。这意味着,即使您在以后的层中取消设置环境变量,它也仍然保留在该层中,并且其值也无法转储。您可以通过创建如下所示的Dockerfile,然后构建它来进行测试。

因此,我按照示例进行操作,

FROM alpine
ENV ADMIN_USER="mark"
RUN echo $ADMIN_USER > ./mark
RUN unset ADMIN_USER

构建图像并运行历史记录,

$ docker history 37c8ebdf36fd
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
37c8ebdf36fd        12 seconds ago      /bin/sh -c unset ADMIN_USER                     0B
789dc0df2bb8        13 seconds ago      /bin/sh -c echo $ADMIN_USER > ./mark            5B
8fc06b8bf4a3        15 seconds ago      /bin/sh -c #(nop)  ENV ADMIN_USER=mark          0B
e7d92cdc71fe        2 months ago        /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
<missing>           2 months ago        /bin/sh -c #(nop) ADD file:e69d441d729412d24…   5.59MB

$ docker run --rm test sh -c 'echo $ADMIN_USER'

mark

我有几个问题,

  1. 该变量应该在以后的层中取消设置(RUN未设置),为什么它仍然存在?

从docker inspect中,我发现了ENV的存储位置,


            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "ADMIN_USER=mark"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "unset ADMIN_USER"
            ],

如果容器启动,它将首先导出ADMIN_USER = mark,然后将其取消设置,则环境变量ADMIN_USER不应该存在。

这意味着即使您在以后的层中取消设置环境变量,它也仍然存在于该层中,并且其值也无法转储。

医生对此进行了解释,但我很困惑。由于该层为0B,因此我假设该层中没有存储任何内容。

  1. 只有0B大小的图层是什么?为什么未将其从最终图像中删除?

通过Moby Project通过Docker的image spec

图像由图层组成。每层都是一组文件系统更改。图层没有配置元数据,例如环境变量或默认参数-这些是整个图像的属性,而不是任何特定的图层。

具有0B的图层应删除(因为它表示没有fs更改),为什么它仍然存在?

  1. 由于ENV命令层仅定义元数据,为什么在Docker历史记录中将其表示为层?

  2. 中间层和图像之间有什么区别?

1 个答案:

答案 0 :(得分:1)

  1. 每个RUN命令都是一个新进程。当您取消设置env变量时,它将在该过程中将其取消设置-不会更改Docker映像。因此,下一个RUN将再次获取环境变量。

  2. (以及3和4)Docker映像格式是一系列层。没有与图层不同的“最终图像”,图像。或者说,图像只是指向特定图层的指针。

标记图像时,您真正要做的是为特定图层命名。