VOLUME在Dockerfile中的目的是什么?
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-2
的 myvolume
文件夹中包含了文件 hello.txt
。
一旦你退出这两个容器,卷也将被删除。
卷被删除是因为它们是 匿名卷,并且你使用了 --rm
选项启动了容器。如果你没有使用 --rm
启动容器,你仍然可以使用 docker rm -v my-container
命令删除容器及其 匿名卷。
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指令。