docker与--volume一起运行

时间:2017-12-15 11:49:17

标签: docker docker-volume

我试图将一些服务停靠在我的机器上进行开发,并想知道/functions-project-12345 /lastmodified: 1234567890 /chat /key-123456 username: "Mat" text: "Hey Bob!" /key-123457 username: "Bob" text: "Hey Mat" 是如何工作的。例如,如果我做了类似

的事情
docker run --volume=..

docker run --volume=/path/to/data:/data [...] 是否会在本地(重新)创建 ,如果它不存在?是否从容器的图像中复制了初始数据?
我们将非常感谢与相关文件的链接。

2 个答案:

答案 0 :(得分:9)

--volume中描述了-v选项,它会将您转到专用的docker run reference docs文档,然后将您转发到Managed data in containers文档。

在那里,它说:

  

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

答案 1 :(得分:3)

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

同时,Docker不会将任何内容从映像复制到bind-mounted卷中,因此挂载路径将在容器内显示为空目录。无论图像中的内容是什么都将被隐藏。

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

  1. 在Dockerfile的最后一步中,将原始目录移动或复制到其他位置。例如。 RUN mv /data /original-data
  2. 向图像添加自定义脚本,该脚本将用作入口点,并将所需数据复制到已装入的卷中(请参阅下面的代码示例)。 Dockerfile指令:ADD entrypoint.sh /entrypoint.sh
  3. 添加ENTRYPOINT指令,指示Docker作为容器初始化的一部分调用脚本:ENTRYPOINT ['/entrypoint.sh']
  4. 脚本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 $@
    

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