6

从 Docker 文档:

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

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

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

4

2 回答 2

5

除了顶层 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 命令都会从中生成一个层,并将其存储为最终映像的一部分。

于 2016-10-21T16:50:54.310 回答
2

如果您在图层中有文件并对其进行修改(使用RUN、 或COPYADD),则会使用新的整个文件创建一个新图层,而不是增量。更糟糕的是,如果您只更改文件的权限属性,RUN chmod 400 file则会创建一个新层,并且整个文件内容都驻留在这个新层中。

问候

于 2016-10-21T17:01:12.767 回答