docker以--volume运行

docker以--volume运行,docker,docker-volume,Docker,Docker Volume,我正试图在我的机器上对一些用于开发的服务进行docker化,我想知道docker是如何运行的--volume=..工作的。例如,如果我做了类似的事情 docker run --volume=/path/to/data:/data [...] 如果/path/to/data不存在,是否仅在本地创建/path/to/data?初始数据是否从容器的图像复制? 相关文档的链接将不胜感激。中介绍了--volume选项,它将您转发到专用文档,然后再转发到文档 上面写着: 如果使用-v或--volume绑定

我正试图在我的机器上对一些用于开发的服务进行docker化,我想知道docker是如何运行的--volume=..工作的。例如,如果我做了类似的事情

docker run --volume=/path/to/data:/data [...]
如果
/path/to/data
不存在,是否仅在本地创建
/path/to/data
?初始数据是否从容器的图像复制?
相关文档的链接将不胜感激。

中介绍了
--volume
选项,它将您转发到专用文档,然后再转发到文档

上面写着:

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


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

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

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

  • 在Dockerfile的最后步骤中,将原始目录移动或复制到其他位置。例如,
    运行mv/数据/原始数据
  • 向映像中添加一个自定义脚本,该脚本将用作入口点,并将所需数据复制到已装入的卷中(请参见下面的代码示例)。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 $@