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 运行的主要内容,如果未能解决你的问题,请参考以下文章