docker 运行 与 --volume
docker run with --volume
我正在尝试将一些服务停靠在我的机器上以进行开发,并且想知道 docker run --volume=..
是如何工作的。例如,如果我做类似
docker run --volume=/path/to/data:/data [...]
/path/to/data
是否会在本地(重新)创建 只有 如果它不存在?初始数据是从容器镜像复制过来的吗?
链接到相关文档将不胜感激。
--volume
选项在 docker run
reference docs, which forwards you on to the dedicated Managed data in containers docs, which then forwards you on to the Bind mounts 文档中有描述。
在那里,它说:
If you use -v
or --volume
to bind-mount a file or directory that does not yet exist on the Docker host, -v
will create the endpoint for you. It is always created as a directory.
是的,只有在主机 FS 上的目录不存在时才会创建它。
同时,Docker不会将镜像中的任何内容复制到绑定挂载的卷中,因此挂载路径将在容器内显示为空目录。图片中的任何内容都将被隐藏。
如果您需要将原始数据复制过来,您需要自己实现这个功能。幸运的是,这很容易做到。
- 在 Dockerfile 的最后几个步骤中,将原始目录移动或复制到其他地方。例如。
RUN mv /data /original-data
- 向映像添加一个自定义脚本,它将作为入口点,并将所需的数据复制到已安装的卷中(请参见下面的代码示例)。 Docker文件指令:
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 $@
如果您的图像中已经有一些入口点脚本,您只需向其中添加适当的逻辑即可。
我正在尝试将一些服务停靠在我的机器上以进行开发,并且想知道 docker run --volume=..
是如何工作的。例如,如果我做类似
docker run --volume=/path/to/data:/data [...]
/path/to/data
是否会在本地(重新)创建 只有 如果它不存在?初始数据是从容器镜像复制过来的吗?
链接到相关文档将不胜感激。
--volume
选项在 docker run
reference docs, which forwards you on to the dedicated Managed data in containers docs, which then forwards you on to the Bind mounts 文档中有描述。
在那里,它说:
If you use
-v
or--volume
to bind-mount a file or directory that does not yet exist on the Docker host,-v
will create the endpoint for you. It is always created as a directory.
是的,只有在主机 FS 上的目录不存在时才会创建它。
同时,Docker不会将镜像中的任何内容复制到绑定挂载的卷中,因此挂载路径将在容器内显示为空目录。图片中的任何内容都将被隐藏。
如果您需要将原始数据复制过来,您需要自己实现这个功能。幸运的是,这很容易做到。
- 在 Dockerfile 的最后几个步骤中,将原始目录移动或复制到其他地方。例如。
RUN mv /data /original-data
- 向映像添加一个自定义脚本,它将作为入口点,并将所需的数据复制到已安装的卷中(请参见下面的代码示例)。 Docker文件指令:
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 $@
如果您的图像中已经有一些入口点脚本,您只需向其中添加适当的逻辑即可。