Dockerfile中VOLUME和RUN mkdir的区别

时间:2018-02-05 21:49:17

标签: docker

阅读What is the purpose of VOLUME in Dockerfile后,我仍然对 VOLUME 的内容毫无头绪?

我的观察是,在Dockerfile中添加以下内容

Add

具有相同的行为
VOLUME /my_directory1

当我RUN mkdir /my_directory2 时,我会观察到2个目录docker exec -it xxxxxx sh并创建了/my_directory1

我相信/my_directory2VOLUME更有意义。就是这样,我在阅读What is the purpose of VOLUME in Dockerfile

后无法理解

有人可以用更简单的术语向我解释,一些动手实例?非常感谢你

2 个答案:

答案 0 :(得分:1)

首先,您无法将VOLUMES与RUN命令进行比较,即使在您将这些作为目录的场景中也是如此。因此,当您在Dockerfile中使用此命令时,

VOLUME /my_directory1

这将成为您的音量的位置。并且,您所包含的图像将按照它从您启动新容器的方式进行编程,实际创建新的卷位置并将其分配给容器中的此目录。这意味着您放入容器中的任何文件都会比容器更长,直到我们手动删除卷。因此,这是卷需要手动删除的一个区别。只需卸下容器就无法清理它们。 volume命令的重点是说这个数据特别重要,至少比容器本身重要得多。

您可以通过检查坐骑下的容器来验证这一点。

"Mounts": [
        {
            ....
            "Source": "/var/lib/docker/volumes/bdc5772c2e1e0575d3e2125a15eb46fd7d1690d251568919f0a599a2c53a1044/_data",
            "Destination": "/my_directory1",
            ....
        }
]

这实际上是运行容器在主机上获取它自己的唯一位置,存储该数据,然后它在后台,映射或安装到容器中的该位置,以便容器中的位置认为它正在写入在/my_directory1位置,但是,它实际上居住在主持人的位置。

另一方面,RUN命令执行您在容器内指定的指令以及在图像顶部创建新图层的每个命令。

RUN mkdir /my_directory2

因此,它会在容器内创建目录。但是,如果删除容器,此目录也会作为短暂删除。

希望这能清除这个概念。谢谢。

答案 1 :(得分:1)

VOLUME命令定义图像上无法取消设置的元数据,指示将存储持久数据的位置。在定义时,docker将保存卷的初始状态的目录内容的快照。在图像中创建卷有两个明显的缺点:

  1. 将来对初始卷内容进行更改的能力非常有限/未定义。将无法看到此位置的卷下图像的更改,任何尝试使用此目录中的内容扩展图像的人都将无法使用您的图像。

  2. 任何使用您的图片但未在运行时在同一位置再次明确定义卷的人都会在docker volume ls中找到匿名卷,这些卷只是guids,没有关于什么容器创建它们或者什么是容器的详细信息他们甚至用于的目录。请记住,即使未在图像中定义,您也可以在运行时定义音量,因此图像中的音量没有上升,但您有这些缺点。

  3. RUN命令通过创建一个新的文件系统层来对图像进行更改,该文件系统层包含来自该命令的文件系统的结果差异。此目录将存在于作为初始容器状态一部分的映像内。如果您只是想在图像中存在目录,则应该使用此选项。