Docker 如何保持图像不可变

How does Docker keep the image immutable

来自 Docker 文档:

The Docker image is read-only. When Docker runs a container from an image, it adds a read-write layer on top of the image (using a UnionFS) in which your application runs.

如何跨层协调更改?如果我更改文件的内容,Docker 只会跟踪增量还是将更改后的文件存储在新层中?

我看了这个讨论at superuser,但仍然不确定最终的图像结构。

图像的每一层都是 RO,除了顶部 RW 容器层和分层文件系统之外的任何卷安装。如果在第一层下载了很多文件,在第二层(第一层上面的容器运行)删除了,第二层有删除命令,但是文件还在第一层.您可以使用 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、或 COPYADD),则会使用新的整个文件创建一个新图层,而不是三角洲。更糟糕的是,如果您只更改文件的权限属性,RUN chmod 400 file 会创建一个新层,并且整个文件内容都驻留在这个新层中。

此致