我一直在尝试读取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指令的原因之一。
答案 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
脚本可用于填充目标目录。