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
我有几个问题,
从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,因此我假设该层中没有存储任何内容。
通过Moby Project通过Docker的image spec:
图像由图层组成。每层都是一组文件系统更改。图层没有配置元数据,例如环境变量或默认参数-这些是整个图像的属性,而不是任何特定的图层。
具有0B的图层应删除(因为它表示没有fs更改),为什么它仍然存在?
由于ENV命令层仅定义元数据,为什么在Docker历史记录中将其表示为层?
中间层和图像之间有什么区别?
答案 0 :(得分:1)
每个RUN
命令都是一个新进程。当您取消设置env变量时,它将在该过程中将其取消设置-不会更改Docker映像。因此,下一个RUN
将再次获取环境变量。
(以及3和4)Docker映像格式是一系列层。没有与图层不同的“最终图像”,图像是。或者说,图像只是指向特定图层的指针。
标记图像时,您真正要做的是为特定图层命名。