在用户指定的位置初始化卷
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
脚本填充目标目录的另一种情况。
一段时间以来,我一直在努力阅读 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
脚本填充目标目录的另一种情况。