在用户指定的位置初始化卷

Initialize volume in user-specified location

一段时间以来,我一直在努力阅读 Docker 卷,但似乎仍然缺少某些内容。

接受这个 Dockerfile:(取自文档)

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

如果我构建并 运行 这只是 docker run <img>,则会创建一个新卷(可以使用 docker inspect <containerid> 找到它的名称)。正如预期的那样,/var/lib/docker/volumes/<volumeid> 的内容只是一个包含 hello world 的文件 greeting

到目前为止一切顺利。现在,假设我想作为用户将此卷放置到自定义位置。我会 运行 docker run -v /host/path/:/myvol。这 不再 工作了。 /host/path 已创建(如果不存在),但为空。

所以,问题是,如何将一些文件放入 Dockerfile 中的卷中,同时允许用户选择放置此卷的位置?在我看来,这似乎是首先使用 Volume 指令的原因之一。

So, the question is, how do I put some files in a Volume in Dockerfile, whilst allowing the user to choose where they put this volume?

你不知道。卷在 运行 时间 创建,而您的 Docker 文件在 构建 时间查阅。

如果您希望在容器 运行 时能够 pre-populate 在 任意 位置的卷,请允许用户提供路径到环境变量中的卷,然后有一个 ENTRYPOINT 脚本在容器启动时将文件复制到卷中。

另一种方法是要求使用特定路径,然后利用这一事实,如果用户在该路径上安装一个新的空卷,Docker 将复制该目录的内容进入音量。例如,如果我有:

FROM alpine
RUN mkdir /data; echo "This is a test" > /data/datafile
VOLUME /data

然后我从中构建图像 testimage,然后 运行:

docker run -it testimage sh

我看到我在 /data 中的卷包含来自底层文件系统的文件:

/ # ls /data
datafile

如果我在该位置安装主机路径,这将不起作用,例如,如果我这样做:

host# mkdir /tmp/empty
host# docker run -it -v /tmp/empty:/data testimage sh

那么生成的路径将为空:

/ # ls /data
/ # 

这是可以使用 ENTRYPOINT 脚本填充目标目录的另一种情况。