Dockerfile中VOLUME和RUN mkdir的区别

问题描述 投票:4回答:3

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

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

VOLUME /my_directory1

与...有相同的行为

RUN mkdir /my_directory2

当我docker exec -it xxxxxx sh,我观察2个目录/my_directory1/my_directory2被创建。

我相信VOLUMEmkdir更有意义。就是这样,在阅读What is the purpose of VOLUME in Dockerfile后我无法理解

有人可以通过一些动手实例向我解释一下吗?非常感谢你

docker
3个回答
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

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

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


0
投票

在Dockerfile中,对目录所做的任何更改都声明为卷未保存在构建的映像中,因此行为不同。

创建卷以将数据保存在容器中。


0
投票

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

  1. 将来对初始卷内容进行更改的能力非常有限/未定义。将无法看到此位置处卷下图像的更改,并且任何尝试使用此目录中的内容扩展图像的人都将无法使用您的图像。
  2. 任何使用您的图像但未在运行时在同一位置再次明确定义卷的人都会在他们的docker volume ls中找到匿名卷,这些卷只是guids,没有关于创建它们的容器或它们甚至用于哪个目录的详细信息。请记住,即使未在图像中定义,您也可以在运行时定义音量,因此图像中的音量没有上升,但您有这些缺点。

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

© www.soinside.com 2019 - 2024. All rights reserved.