【问题标题】:Initialize volume in user-specified location在用户指定的位置初始化卷
【发布时间】:2017-01-23 12:57:35
【问题描述】:

一段时间以来,我一直在尝试阅读 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 中,同时允许用户选择他们放置这个 Volume 的位置?在我看来,这似乎是首先使用 Volume 指令的原因之一。

【问题讨论】:

    标签: docker docker-volume


    【解决方案1】:

    所以,问题是,我如何将一些文件放在一个 Volume 中 Dockerfile,同时允许用户选择他们把它放在哪里 音量?

    你没有。 runtime 时会创建一个卷,而 build 时会查询您的 Dockerfile。

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

    另一种方法是要求使用特定路径,然后利用这样一个事实,即如果用户在该路径上挂载一个新的空卷,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 脚本填充目标目录的另一种情况。

    【讨论】:

    • 我了解在运行映像时会创建一个卷。但是,当我不使用 -v 选项时,该卷会在运行时由构建时指定的文件填充。我试图思考 VOLUME 指令背后的原因。在这一点上,我唯一能看到的是告诉 Docker 我想要将图像/容器的一些文件夹存储在主机上,但不是为了持久性(因为文件将存储在每个 docker run 的不同路径中) .那么调试呢?似乎是一个非常小众的用途,所以我一定错过了一些东西。
    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 2010-11-29
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多