结合VOLUME + docker run -v

8oomwypt  于 2023-04-29  发布在  Docker
关注(0)|答案(1)|浏览(138)

在编写Dockerfile时,我正在寻找关于VOLUME条目的解释,并遇到了以下语句
卷是存储在/var/lib/docker/volumes/...中的持久数据
您可以在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

这是他们的意思吗?

3qpi33ja

3qpi33ja1#

  • 您可能不希望在Dockerfile中包含VOLUME。它不需要在运行时挂载文件或目录,而且它有令人困惑的副作用,比如使后续的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镜像中。

相关问题