在阅读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
被创建。
我相信VOLUME
比mkdir
更有意义。就是这样,在阅读What is the purpose of VOLUME in Dockerfile后我无法理解
有人可以通过一些动手实例向我解释一下吗?非常感谢你
首先,您无法将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
因此,它会在容器内创建目录。但是,如果删除容器,此目录也会作为短暂删除。
希望这能清除这个概念。谢谢。
在Dockerfile中,对目录所做的任何更改都声明为卷未保存在构建的映像中,因此行为不同。
创建卷以将数据保存在容器中。
VOLUME
命令定义图像上不能取消设置的元数据,指示将存储持久数据的位置。在定义时,docker将保存卷的初始状态的目录内容的快照。在图像中创建卷有两个重要缺点:
docker volume ls
中找到匿名卷,这些卷只是guids,没有关于创建它们的容器或它们甚至用于哪个目录的详细信息。请记住,即使未在图像中定义,您也可以在运行时定义音量,因此图像中的音量没有上升,但您有这些缺点。RUN
命令通过创建一个新的文件系统层来对图像进行更改,该文件系统层包含来自该命令的文件系统的结果差异。此目录将存在于作为初始容器状态一部分的映像内。如果您只想在图像中存在目录,则应该使用此选项。