Docker如何保持图像不可变

从Docker文档:

Docker镜像是只读的。 当Docker从图像运行一个容器时,它会在应用程序运行的图像上添加一个读写图层(使用UnionFS)。

各层之间的变化是如何协调的? 如果我更改文件的内容,Docker是否只跟踪增量或者将更改的文件存储在新的层?

我以超级用户的眼光看待这个讨论,但对于最终的图像结构仍然不确定。

如果在一个图层中有一个文件并对其进行修改(使用RUNCOPYADD ),则会使用新的整个文件创build新图层,而不是使用delta。 更糟糕的是,如果只更改文件的权限属性, RUN chmod 400 file会创build一个新图层,并且整个文件内容将驻留在此新图层中。

问候

图像的每个图层都是RO,除了最上面的RW容器图层和分层文件系统之外的任何卷assembly。 如果在第一层中下载大量文件,并在第二层(运行在第一层之上的容器)中删除它们,则第二层包含删除命令,但文件仍然存在于第一层中。 你可以通过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层的内容。 当你build立一个图像时,每个运行命令都会从这个图层中生成一个图层,并作为最终图像的一部分进行存储。