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

时间:2017-01-23 12:57:36

标签: docker docker-volume

我一直在尝试读取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>的内容只是一个包含greeting的文件hello world

到目前为止一切顺利。现在,作为用户,我希望将此卷放在自定义位置。我会跑docker run -v /host/path/:/myvol。这样工作了。 <{1}}已创建(如果它不存在),但为空。

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

1 个答案:

答案 0 :(得分:2)

  

所以,问题是,我如何在一个卷中放入一些文件   Dockerfile,同时允许用户选择放置它的位置   音量?

你没有。在运行时创建卷,而在 build 时查询Dockerfile。

如果您希望能够在容器运行时在任意位置预填充卷,请允许用户在环境变量中提供卷的路径,然后使用{ {3}}脚本,在容器启动时将文件复制到卷中。

另一种方法是要求使用特定路径,然后利用以下事实:如果用户在该路径上安装新的空卷,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脚本可用于填充目标目录。