gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:20:35 25 4
gpt4 key购买 nike

我已经尝试阅读 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 。这不再起作用了。 /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?

你不知道。卷在运行时创建,而您的 Dockerfile 在构建时查阅。

如果您希望在容器运行时能够在任意位置预填充卷,请允许用户在环境变量中提供该卷的路径,然后使用 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 - 在用户指定的位置初始化卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41806976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com