docker运行与 – volume

我试图dockerize一些服务在我的机器上进行开发,想知道如何docker run --volume=..工作。 例如,如果我做类似的事情

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

只有在不存在的情况下, 才会在本地创build/path/to/data重新创build/path/to/data ? 是从容器的图像复制的初始数据?
链接到相关的文件将不胜感激。

--volume docker run参考文档中介绍了--volume选项,该选项将转发给容器文档中的专用托pipe数据 ,然后将其转发给绑定安装文档。

在那里,它说:

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

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

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

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

  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 $@ 

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