Dockerfile中VOLUME的用途是什么

rad*_*226 79 volume docker

我正在努力深入了解Docker的数量,并且我很难弄清楚差异/用例:

  • docker volume create命令
  • docker run -v /path:/host_path
  • 文件中的VOLUME条目Dockerfile

我特别不明白如果将VOLUME条目与-v标志组合起来会发生什么.

如果有人理解得很好,请解释我!

Von*_*onC 56

卷是存储在其中的持久数据 /var/lib/docker/volumes/...

  • 您可以在Dockerfile中声明它,这意味着每次从映像启动容器时,即使您没有任何选项,也会创建卷()-v.

  • 您可以在运行时声明它docker run -v [host-dir:]container-dir.
    将两者(VOLUME+ docker run -v)组合在一起意味着您可以将主机文件夹的内容装入容器中持久存储的卷中/var/lib/docker/volumes/...

  • docker volume create创建一个卷,而无需定义Dockerfile并构建映像并运行容器.它用于快速允许其他容器安装所述容积.

如果您在卷中保留了一些内容,但从那时起删除了容器(默认情况下不会删除其关联的卷,除非您使用的是docker rm -v),您可以将所述卷重新附加到新容器(声明相同的数量).

请参阅" Docker - 如何访问未附加到容器的卷? ".
使用docker volume create,可以轻松地将命名卷重新连接到容器.

docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer

# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!
Run Code Online (Sandbox Code Playgroud)

  • 假设您将Dockerfile和VOLUME以及-v / path:/ host_path /标志一起使用。`VOLUME`的内容将被`/ host_path /`?的内容覆盖。 (2认同)

Kor*_*gay 15

VOLUME当您将指令与volumes-from运行时参数结合使用时,指令会变得有趣。

给定以下 Dockerfile:

FROM busybox
VOLUME /myvolume
Run Code Online (Sandbox Code Playgroud)

使用以下命令构建图像:

FROM busybox
VOLUME /myvolume
Run Code Online (Sandbox Code Playgroud)

并旋转一个容器:

docker run --rm -it --name my-first-bb my-bb
Run Code Online (Sandbox Code Playgroud)

首先要注意的是,您将在此图像中拥有一个名为myvolume. 但这并不是特别有趣,因为当我们退出容器时,卷也将被删除。

在此文件夹中创建一个空文件,因此在容器中运行以下命令:

cd myvolume
touch hello.txt
Run Code Online (Sandbox Code Playgroud)

现在启动一个新容器,但与my-first-bb以下内容共享相同的卷:

docker run --rm -it --volumes-from my-first-bb --name my-second-bb my-bb
Run Code Online (Sandbox Code Playgroud)

您将看到my-second-bb包含文件hello.txtmyvolume文件夹。

退出两个容器后,您的卷也将被删除。

  • 这些卷将被删除,因为它们是**匿名卷**并且您使用“--rm”选项启动了容器。我认为提及它可能会起作用。如果您没有使用“--rm”启动容器,您仍然可以使用“docker rm -v my-container”删除容器及其*匿名卷*。 (5认同)

M20*_*014 6

  1. 在 Dockerfile 中指定 VOLUME 可确保该文件夹在运行时被视为卷(即外部容器),而不是容器内的常规目录。注意性能和可访问性的影响;
  2. 如果忘记-vdocker run命令行中指定,上述情况仍然成立。只是卷名变成了匿名。但仍然有方法可以访问或恢复此类匿名卷中的数据。