VOLUME在Dockerfile中的目的是什么?

9 浏览
0 Comments

VOLUME在Dockerfile中的目的是什么?

我正在努力加深对Docker卷的理解,但是很难弄清楚以下几点的区别和使用场景:\n- `docker volume create` 命令\n- `docker run -v /path:/host_path` 命令\n- `Dockerfile` 文件中的 `VOLUME` 指令\n尤其是如果将 `VOLUME` 指令与 `-v` 标志结合使用,我完全不明白会发生什么。

0
0 Comments

问题的出现原因:Dockerfile中的VOLUME命令用于指定一个文件夹在运行时应被视为一个卷(即容器外部),而不是容器内的一个普通目录。这样做的目的是为了确保该文件夹在容器运行时具有卷的特性,以及注意性能和可访问性的影响。

解决方法:可以在Dockerfile中使用VOLUME命令来指定一个文件夹作为卷,并在运行容器时使用"-v"选项来映射该卷到宿主机的特定路径。如果忘记在"docker run"命令行中指定"-v"选项,那么上述原则仍然有效,只是卷的名称会变成匿名的。但仍然有方法可以访问或恢复这些匿名卷中的数据。

0
0 Comments

VOLUME 指令在与 volumes-from 运行时参数结合使用时变得非常有趣。

首先,我们通过以下 Dockerfile 构建一个镜像:

FROM busybox
VOLUME /myvolume

使用以下命令构建镜像:

docker build -t my-busybox .

然后通过以下命令启动一个容器:

docker run --rm -it --name my-busybox-1 my-busybox

首先要注意的是,你将在这个镜像中看到一个名为 myvolume 的文件夹。但是由于当我们退出容器时,该卷也会被删除,所以它并不特别有趣。

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

cd myvolume
touch hello.txt

现在启动一个新的容器,并与 my-busybox-1 共享同一个卷:

docker run --rm -it --volumes-from my-busybox-1 --name my-busybox-2 my-busybox

你会发现 my-busybox-2myvolume 文件夹中包含了文件 hello.txt

一旦你退出这两个容器,卷也将被删除。

卷被删除是因为它们是 匿名卷,并且你使用了 --rm 选项启动了容器。如果你没有使用 --rm 启动容器,你仍然可以使用 docker rm -v my-container 命令删除容器及其 匿名卷

0
0 Comments

Dockerfile中的VOLUME指令的目的是什么?这个问题的出现的原因是有人想要了解VOLUME指令的作用和用法。VOLUME指令用于在Dockerfile中声明持久化数据存储位置。可以通过两种方式创建volume,一种是在Dockerfile中声明,这意味着每次从镜像启动容器时,都会创建一个空的volume;另一种是在运行时使用docker run命令的-v选项声明。将这两种方式结合起来,可以将主机文件夹的内容挂载到容器中持久化存储的volume中。

如果已经创建了一个volume并存储了一些内容,但是后来删除了容器(默认情况下不会删除关联的volume,除非使用了docker rm -v命令),可以通过在新的容器中重新挂载该volume来重新连接该volume。使用docker volume create命令可以方便地重新连接一个命名的volume。

在运行带有VOLUME和-v选项的Dockerfile时,VOLUME指令中的内容会被-v选项中指定的内容覆盖。

如果使用docker volume create命令创建了一个volume,并通过docker run --volume-from命令运行容器,如何知道挂载点的位置?在主机上没有挂载点(除了原生的空的/var/lib/docker/volume文件夹)。volume的路径存储在volume的元数据中。

如果想要使用独立的volume,但仍然希望它们持久存在于主机上,可以使用插件,比如github.com/cwspear/local-persist。

在使用docker run -v命令时,不需要Dockerfile中的VOLUME指令。

0