当 Dockerfile 包含 VOLUME 指令(比如)VOLUME [/opt/apache2/www, ...](希望这个路径在实际安装中存在)时,这意味着这个路径将被挂载到某个东西上(对吧?)。这个 VOLUME 指令是针对图像的,而不是针对它的一个实例(容器),而是针对每个实例。

无论如何,无论镜像是否包含定义的 VOLUME,在启动容器时,run 命令都可以通过将本地主机路径映射到容器路径来创建卷。

docker run --name understanding_volumes -v /localhost/path1:/opt/apache2/www -v /localhost/path2:/any/container/path image_name

上面应该清楚地表明,虽然 /any/container/path 在 Dockerfile 中没有定义为 VOLUME,但我们可以在运行容器时挂载它。

也就是说,这个 SOF 问题对此有所了解 - What is the purpose of defining VOLUME mount points within DockerFile rather than adhoc cmd-line -v? 。这里提到了 VOLUME 指令的一个好处。也就是说,其他容器可以从中受益。使用 --from-container (无法为 docker run --help 找到此选项,不确定答案是否意味着 --volumes-from )无论如何,因此其他容器可以以某种自动方式访问挂载点。伟大的。

我的第一个问题是,安装到容器上的另一个卷路径 /any/container/path image_name 是否也可用于使用 --from-container--volumes-from 的第二个容器(以正确的选项为准)?

我的下一个问题是,使用 VOLUME 指令只是为了让其他容器链接到此路径 --> 即通过简单链接使其他容器可以使用 /opt/apache2/www 上的数据。所以它只是分享出来。或者是否有任何数据也可以提供给第一个容器。

最佳答案

在 Dockerfile 中定义卷的优点是将图像定义中的卷位置指定为从图像创建者到图像用户的文档。这只是唯一的好处。

它很早就被添加到 docker 中,很可能是在数据容器是持久化数据的唯一方式时。我们现在有一个针对具有过时数据容器的命名卷的解决方案。我们还添加了 compose 文件来定义容器如何以易于理解和重用的语法运行。

虽然自我记录的图像有一个优点,但也有很多缺点,以至于 我强烈建议不要在图像 中定义一个卷给我的客户和任何发布图像以供一般重用的人:

  • 卷是强制给最终用户的,无法在图像中取消定义卷。
  • 如果卷未在运行时定义(使用 -v 或 compose 文件),用户将在其 docker volume ls 中看到与创建它们的内容没有关联的匿名卷。这些几乎总是无用的磁盘空间浪费。
  • 它们破坏了扩展图像的能力,因为在 VOLUME 行之后对图像中的卷所做的任何更改通常都会被 docker 忽略。这意味着用户永远不能添加他们自己的初始卷数据,这是非常令人困惑的,因为 docker 没有警告它在镜像构建期间忽略用户更改。
  • 如果您需要一个卷作为用户运行时,您始终可以使用 -v 或 compose 文件定义它,即使该卷未在 Dockerfile 中定义。许多用户有一种误解,认为您必须在镜像中定义它才能在运行时使其成为命名卷。

  • 定义图像中的体积不会影响使用 --volumes-from 的能力,但我鼓励您避免使用此功能。它在 swarm 模式下不存在,您可以通过使用安装在两个容器中的命名卷来获得所有相同的功能以及更多的粒度。

    关于docker - Dockerfile 命令 "Volume"的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49620300/

    10-16 23:53