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。 幸运的是,这很容易做到。
- 在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 $@
如果图像中已有一些入口点脚本,则可以添加适当的逻辑。