Docker 如何保持镜像不变

use*_*694 6 docker unionfs

从 Docker 文档:

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

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

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

BMi*_*tch 5

镜像的每一层都是 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
Run Code Online (Sandbox Code Playgroud)

diff是容器RO层的内容。当你构建一个镜像时,每个 RUN 命令都会从中生成一个层,作为最终镜像的一部分存储。


Car*_*rez 2

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

问候