首页 > 解决方案 > 结合 VOLUME + docker run -v

问题描述

在编写 Dockerfile 时,我正在寻找关于 VOLUME 条目的解释并遇到了这个声明

卷是存储在/var/lib/docker/volumes/...

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

您可以在运行时声明它docker run -v [host-dir:]container-dir。将两者结合起来 ( VOLUME+ docker run -v) 意味着您可以将主机文件夹的内容挂载到由容器持久保存的卷中/var/lib/docker/volumes/...

docker volume create创建卷,而无需定义Dockerfile和构建映像并运行容器。它用于快速允许其他容器挂载所述卷。

但我很难理解这条线:

...结合两者 ( VOLUME+ docker run -v) 意味着您可以将主机文件夹的内容安装到由容器持久保存的卷中/var/lib/docker/volumes/...

例如,假设我的主机上有一个配置文件,我根据我用Dockerfile我编写的镜像运行容器。它会将配置文件复制到我在卷条目中声明的卷中吗?

会不会像(伪代码)

#dockerfile
From Ubuntu

Run apt-get update

Run apt-get install mysql

Volume . /etc/mysql/conf.d

Cmd systemcl start MySQL

当我运行它时

docker run -it -v /path/to/config/file:  ubuntu_based_image

这是他们的意思吗?

标签: dockerdockerfile

解决方案


  • 您可能不希望VOLUME在您的 Dockerfile 中。没有必要在运行时挂载文件或目录,并且它具有令人困惑的副作用,例如使后续RUN命令静默丢失状态。

  • 如果一个镜像确实有VOLUME,并且当你启动容器时你没有挂载其他任何东西,Docker 将创建一个匿名卷并为你挂载它。如果您不清理这些卷,这可能会导致空间泄漏。

  • 您可以在任何容器目录上使用docker run -v选项,无论它是否声明为VOLUME.

  • 如果你docker run -v /host/path:/container/path,这两个目录实际上是相同的;没有任何内容被复制,并且对其中一个的写入(应该是)在另一个上立即可见。

  • docker run -v /host/path:/container/path绑定安装根本不可见/var/lib/docker

  • 您通常不应该查看其中的内容/var/lib/docker(如果您不在本机 Linux 主机上,则不能查看)。如果您需要直接访问卷文件内容,请使用绑定挂载而不是命名或匿名卷。

  • 像您展示的那样绑定挂载适用于将配置文件注入容器,以及读取日志文件。命名卷适用于有状态应用程序的存储,例如 MySQL 数据库的数据。两种类型的卷都不适合代码或库;而是将它们直接构建到 Docker 映像中。


推荐阅读