Dockerfile命令"Volume"的目的是什么?
What is the purpose of Dockerfile command "Volume"?
当一个 Dockerfile 包含 VOLUME 指令(比如说)VOLUME [/opt/apache2/www, ...]
(希望这个路径存在于实际安装中),这意味着这个路径将被挂载到某个东西上(对吧?)。而这个 VOLUME 指令是针对图像的,而不是针对它的一个实例(容器),而是针对每个实例。
无论如何,无论图像是否包含定义的 VOLUME,在启动容器时,运行 命令都可以通过将本地主机路径映射到容器路径来创建卷。
docker run --name understanding_volumes -v /localhost/path1:/opt/apache2/www -v /localhost/path2:/any/container/path image_name
上面应该说清楚了,虽然/any/container/path
在Dockerfile中没有定义为VOLUME,但是我们可以在运行ning容器时挂载它。
就是说,这个 SOF 问题对它有所启发 - 。这里提到了 VOLUME 指令的一个好处。也就是说,其他容器可以从中受益。使用 --from-container
(无法为 docker run --help
找到此选项,不确定答案是否意味着 --volumes-from
)无论如何,其他容器可以通过某种自动方式访问挂载点。伟大的。
我的第一个问题是,安装到容器 understanding_volumes 的另一个卷路径 /any/container/path image_name
是否也可用于使用 [=14 的第二个容器=] 或 --volumes-from
(选择正确的选项)?
我的下一个问题是,使用 VOLUME 指令只是为了让其他容器 link 到此路径 --> 即让 /opt/apache2/www
上的数据可供其他容器使用简单 linking。所以它只是分享出来。或者是否有任何数据也可以提供给第一个容器。
在 Dockerfile 中定义一个卷的好处是可以在图像定义中指定卷位置,作为从图像创建者到图像用户的文档。这几乎是唯一的好处。
它很早就被添加到 docker,很可能是在数据容器是保存数据的唯一方式时。我们现在有一个针对已过时数据容器的命名卷的解决方案。我们还添加了 compose 文件,以易于理解和重用的语法定义容器 运行。
虽然自我记录的图像有一个优点,但也有很多缺点,以至于我强烈建议不要向我的客户在图像中定义一个体积以及发布图像以供一般重复使用的任何人:
卷是强制给最终用户的,无法在映像中取消定义卷。
如果卷未在 运行 时定义(使用 -v
或撰写文件),用户将在其 docker volume ls
中看到匿名卷与创建它们的原因无关。这些几乎都是无用的磁盘浪费space.
它们破坏了扩展图像的能力,因为 VOLUME
行之后对图像体积的任何更改通常会被 docker 忽略。这意味着用户永远无法添加他们自己的初始体积数据,这非常令人困惑,因为 docker 没有发出警告,表明它在映像构建期间忽略了用户更改。
如果您 运行 需要一个卷作为用户,您总是可以用 -v
或撰写文件定义它,即使该卷不是在 Dockerfile 中定义。许多用户有一种误解,认为您必须在映像中定义它才能在 运行 时使其成为命名卷。
使用 --volumes-from
的功能不受在图像中定义体积的影响,但我建议您避免使用此功能。它在 swarm 模式下不存在,您可以通过使用安装在两个容器中的命名卷获得所有相同的功能以及更多粒度。
当一个 Dockerfile 包含 VOLUME 指令(比如说)VOLUME [/opt/apache2/www, ...]
(希望这个路径存在于实际安装中),这意味着这个路径将被挂载到某个东西上(对吧?)。而这个 VOLUME 指令是针对图像的,而不是针对它的一个实例(容器),而是针对每个实例。
无论如何,无论图像是否包含定义的 VOLUME,在启动容器时,运行 命令都可以通过将本地主机路径映射到容器路径来创建卷。
docker run --name understanding_volumes -v /localhost/path1:/opt/apache2/www -v /localhost/path2:/any/container/path image_name
上面应该说清楚了,虽然/any/container/path
在Dockerfile中没有定义为VOLUME,但是我们可以在运行ning容器时挂载它。
就是说,这个 SOF 问题对它有所启发 - --from-container
(无法为 docker run --help
找到此选项,不确定答案是否意味着 --volumes-from
)无论如何,其他容器可以通过某种自动方式访问挂载点。伟大的。
我的第一个问题是,安装到容器 understanding_volumes 的另一个卷路径 /any/container/path image_name
是否也可用于使用 [=14 的第二个容器=] 或 --volumes-from
(选择正确的选项)?
我的下一个问题是,使用 VOLUME 指令只是为了让其他容器 link 到此路径 --> 即让 /opt/apache2/www
上的数据可供其他容器使用简单 linking。所以它只是分享出来。或者是否有任何数据也可以提供给第一个容器。
在 Dockerfile 中定义一个卷的好处是可以在图像定义中指定卷位置,作为从图像创建者到图像用户的文档。这几乎是唯一的好处。
它很早就被添加到 docker,很可能是在数据容器是保存数据的唯一方式时。我们现在有一个针对已过时数据容器的命名卷的解决方案。我们还添加了 compose 文件,以易于理解和重用的语法定义容器 运行。
虽然自我记录的图像有一个优点,但也有很多缺点,以至于我强烈建议不要向我的客户在图像中定义一个体积以及发布图像以供一般重复使用的任何人:
卷是强制给最终用户的,无法在映像中取消定义卷。
如果卷未在 运行 时定义(使用
-v
或撰写文件),用户将在其docker volume ls
中看到匿名卷与创建它们的原因无关。这些几乎都是无用的磁盘浪费space.它们破坏了扩展图像的能力,因为
VOLUME
行之后对图像体积的任何更改通常会被 docker 忽略。这意味着用户永远无法添加他们自己的初始体积数据,这非常令人困惑,因为 docker 没有发出警告,表明它在映像构建期间忽略了用户更改。如果您 运行 需要一个卷作为用户,您总是可以用
-v
或撰写文件定义它,即使该卷不是在 Dockerfile 中定义。许多用户有一种误解,认为您必须在映像中定义它才能在 运行 时使其成为命名卷。
使用 --volumes-from
的功能不受在图像中定义体积的影响,但我建议您避免使用此功能。它在 swarm 模式下不存在,您可以通过使用安装在两个容器中的命名卷获得所有相同的功能以及更多粒度。