从 Docker 文档:
Docker 映像是只读的。当 Docker 从镜像运行容器时,它会在运行应用程序的镜像之上添加一个读写层(使用 UnionFS)。
如何跨层协调变化?如果我更改文件的内容,Docker 会只跟踪增量还是将更改的文件存储在新层中?
我在 superuser上查看了这个讨论,但仍然不确定最终的图像结构。
从 Docker 文档:
Docker 映像是只读的。当 Docker 从镜像运行容器时,它会在运行应用程序的镜像之上添加一个读写层(使用 UnionFS)。
如何跨层协调变化?如果我更改文件的内容,Docker 会只跟踪增量还是将更改的文件存储在新层中?
我在 superuser上查看了这个讨论,但仍然不确定最终的图像结构。
除了顶层 RW 容器层和分层文件系统之外的任何卷挂载,映像的每一层都是 RO。如果你在第一层下载了很多文件,然后在第二层删除它们(容器运行在第一层之上),第二层包含删除命令,但文件仍然存在于第一层。您可以使用以下命令查看结果docker diff
:
$ docker run -it --name busytest busybox
/ # echo "hello world" >/root/test.txt
/ # rm /bin/rpm
/ # rm /bin/timeout
/ # rm /bin/wall
/ # exit
$ docker diff busytest
C /bin
D /bin/rpm
D /bin/timeout
D /bin/wall
C /root
A /root/.ash_history
A /root/test.txt
diff是容器RO层的内容。当您构建映像时,每个 RUN 命令都会从中生成一个层,并将其存储为最终映像的一部分。
如果您在图层中有文件并对其进行修改(使用RUN
、 或COPY
或ADD
),则会使用新的整个文件创建一个新图层,而不是增量。更糟糕的是,如果您只更改文件的权限属性,RUN chmod 400 file
则会创建一个新层,并且整个文件内容都驻留在这个新层中。
问候