使用--volume参数的docker run命令

40

我正在尝试将一些服务docker化以便在我的计算机上进行开发,并想知道如何使用docker run --volume=..。例如,如果我做了这样的事情:

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

仅当本地不存在时,/path/to/data才会被(重新)创建?初始数据是否从容器的镜像中复制?
提供相关文档链接将不胜感激。

2个回答

41

--volume选项在docker run参考文档中有描述,该文档会将您引导至专门的容器中管理数据文档,然后再引导您至绑定挂载文档。

在那里,它说:

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

示例:

docker run -it -v ${PWD}/scripts:/code/scripts myimage bash

7
请提供一个实际应用的例子。 - Luke Pighetti

9
是的,如果主机文件系统上的目录不存在,则会创建该目录。同时,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 $@

如果您的镜像中已经存在某个入口脚本,您可以直接向其中添加相应的逻辑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接