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
、或 COPY
或 ADD
),则会使用新的整个文件创建一个新图层,而不是三角洲。更糟糕的是,如果您只更改文件的权限属性,RUN chmod 400 file
会创建一个新层,并且整个文件内容都驻留在这个新层中。
此致
来自 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
、或 COPY
或 ADD
),则会使用新的整个文件创建一个新图层,而不是三角洲。更糟糕的是,如果您只更改文件的权限属性,RUN chmod 400 file
会创建一个新层,并且整个文件内容都驻留在这个新层中。
此致