docker与--volume一起运行

pla*_*etp 6 docker docker-volume

我正在尝试将一些服务停靠在我的机器上进行开发,并想知道它是如何docker run --volume=..工作的.例如,如果我做了类似的事情

docker run --volume=/path/to/data:/data [...]
Run Code Online (Sandbox Code Playgroud)

只有在不存在的情况下才会/path/to/data(重新)在本地创建?是否从容器的图像中复制了初始数据? 将赞赏有关文件的链接.

Oli*_*rth 9

参考文档中--volume描述了该选项,该docker run文档将您转发到容器文档中的专用托管数据,然后将您转发到Bind安装文档.

在那里,它说:

如果您使用-v--volume绑定装载Docker主机上尚不存在的文件或目录,-v则会为您创建端点.它始终作为目录创建.

  • 请提供一个实际使用的示例 (10认同)

小智 9

是的,仅当主机 FS 上的目录尚不存在时才会创建该目录。

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

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

  1. 在 Dockerfile 的最后步骤中,将原始目录移动或复制到其他位置。例如RUN mv /data /original-data
  2. 将自定义脚本添加到映像中,该脚本将用作入口点,并将所需的数据复制到已安装的卷中(请参阅下面的代码示例)。Dockerfile 指令:ADD entrypoint.sh /entrypoint.sh
  3. 添加 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 $@
Run Code Online (Sandbox Code Playgroud)

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