docker 使用 --volume 运行

Posted

技术标签:

【中文标题】docker 使用 --volume 运行【英文标题】:docker run with --volume 【发布时间】:2018-05-29 15:07:35 【问题描述】:

我正在尝试在我的机器上对接一些开发服务,并想知道docker run --volume=.. 是如何工作的。例如,如果我做类似的事情

docker run --volume=/path/to/data:/data [...]

如果/path/to/data 不存在,会在本地(重新)创建它吗?初始数据是从容器镜像中复制过来的吗? 相关文档的链接将不胜感激。

【问题讨论】:

【参考方案1】:

是的,只有在主机 FS 上的目录不存在时才会创建它。

同时,Docker 不会将映像中的任何内容复制到绑定挂载的卷中,因此挂载路径将在容器内显示为空目录。图像中的任何内容都将被隐藏。

如果您需要复制原始数据,则需要自己实现此功能。幸运的是,这很容易做到。

    在 Dockerfile 的最后几个步骤中,将原始目录移动或复制到别处。例如。 RUN mv /data /original-data 将自定义脚本添加到映像中,该脚本将用作入口点,并将所需的数据复制到已安装的卷中(参见下面的代码示例)。 Dockerfile 指令:ADD entrypoint.sh /entrypoint.sh 添加 ENTRYPOINT 指令,指示 Docker 在容器初始化过程中调用您的脚本:ENTRYPOINT ['/entrypoint.sh']

脚本entrypoint.sh 可能如下所示(简化示例):

#!/bin/bash
set -e
SOURCE_DIR=/original-data 
TARGET_DIR=/data
if [ $(find $TARGET_DIR -maxdepth 0 -type d -empty) 2>/dev/null) ]; then
   cp -r --preserve-all $SOURCE_DIR/* $TARGET_DIR/
fi

# continue Docker container initialization, execute CMD
exec $@

如果您的图像中已经有一些入口点脚本,您可以为其添加适当的逻辑。

【讨论】:

【参考方案2】:

--volume 选项在 docker run reference docs 中进行了描述,它将您转发到专用的 Managed data in containers 文档,然后将您转发到 Bind mounts 文档。

上面写着:

如果您使用-v--volume 绑定挂载Docker 主机上尚不存在的文件或目录,-v 将为您创建端点。它总是被创建为一个目录。

【讨论】:

以上是关于docker 使用 --volume 运行的主要内容,如果未能解决你的问题,请参考以下文章

docker 使用 --volume 运行

Docker - 简单粗暴快速理解挂载与实战

Docker - 简单粗暴快速理解挂载与实战

docker监控weavworks/scope,单台和多台部署

docker volume

理解Docker:Docker 存储之卷(Volume)