docker - 结合 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
这是他们的意思吗?
解决方案
您可能不希望
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 映像中。