Dockerfile:理解 VOLUME 指令

标签 docker dockerfile

举个例子吧。

以下是nginx图片的VOLUME指令:

VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

这是我的问题:

  1. 当你启动容器时,这些目录会出现在我的主机上吗?当我停止容器时,目录会保留吗?

  2. 如果这些目录中的一些(或全部)已经存在于我的主机中,会发生什么?例如,假设图像在容器的 /etc/nginx 目录中带有一个默认配置文件,而我在 /etc/nginx 中也有一个配置文件在我的主机上。当容器启动时,这些文件中的哪一个会获得优先权?

  3. -v/host/dir:container/dirVOLUME 的主要区别是什么?

引用资料:

最佳答案

容器的卷只是主机上的目录,无论它们是由什么方法创建的。如果你没有在主机上指定目录,Docker 将为卷创建一个新目录,通常在 /var/lib/docker/vfs 下。

无论卷是如何创建的,使用 docker inspect 命令很容易找到它在主机上的位置,例如:

$ ID=$(docker run -d -v /data debian echo "Data container")
$ docker inspect -f {{.Mounts}} $ID
[{0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951 /var/lib/docker/volumes/0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951/_data /data local  true }]
 

我们可以看到 Docker 在 /var/lib/docker/volumes/0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951/_data 处为该卷创建了一个目录。

您可以从主机上随意修改/添加/删除该目录中的文件,但请注意,您可能需要使用 sudo 获取权限。

Docker只会在两种情况下删除卷目录:

  • 如果 --rm 选项被赋予 docker run,容器退出时所有卷都将被删除
  • 如果使用 docker rm -v CONTAINER 删除容器,所有卷都将被删除。

在这两种情况下,只有在没有其他容器引用它们时才会删除卷。 Docker 永远不会删除映射到特定主机目录的卷(-v HOST_DIR:CON_DIR 语法)。但是,如果您删除卷的容器,命名方案意味着您将很难确定哪个目录包含该卷。

所以,具体问题:

  1. 是的,是的,但有上述注意事项。
  2. 每个 Docker 托管卷都会在主机上获得一个新目录
  3. VOLUME 指令与 -v 相同,但不指定主机目录。指定主机目录时,Docker 不会为卷创建任何目录,不会从镜像中复制文件并且永远不会删除卷(docker rm -v CONTAINER 不会删除映射到的卷)用户指定的主机目录)。

更多信息在这里:

https://blog.container-solutions.com/understanding-volumes-docker

关于Dockerfile:理解 VOLUME 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28510982/

相关文章:

spring - 带有 spring boot 的 Redis 缓存 docker 容器在我的本地机器上不工作

docker - 如何远程从私有(private) Docker Hub 存储库中提取 Docker 镜像?

docker - Docker镜像层: `ADD file:<some_hash> in/`是什么意思?

mysql - 带有 -v 标志的 Docker 运行命令将容器置于退出状态

spring - Docker:客户端和服务器之间的链接

php - 如何在同一容器中运行cron和Web应用程序?

docker - 如何运行使用 go binary 创建的 docker 容器?

docker - 将 Docker Machine 与 Swarm 一起使用和通过 Docker 守护进程使用 Swarm 有什么区别?

eclipse - 使用 Docker 容器时如何在 Eclipse 中添加包含和库路径

python-3.x - 在docker上获取太多悬空图像-撰写