Docker如何使图像保持不变

时间:2016-10-21 16:12:38

标签: docker unionfs

来自Docker文档:

  

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

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

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

2 个答案:

答案 0 :(得分:3)

图像的每一层都是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命令都会从中生成一个图层,作为最终图像的一部分存储。

答案 1 :(得分:1)

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

此致