【问题标题】:Combing VOLUME + docker run -v结合 VOLUME + docker run -v
【发布时间】:2021-05-25 07:02:27
【问题描述】:

我在编写 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

这是他们的意思吗?

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:
    • 您可能不希望在 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 映像中。

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2020-12-07
      • 1970-01-01
      相关资源
      最近更新 更多