【问题标题】:What type of volume is a Dockerfile VOLUME instruction creating?Dockerfile VOLUME 指令创建什么类型的卷?
【发布时间】:2019-08-29 14:24:52
【问题描述】:

Docker 使用较新的 —-mount 参数创建卷。在这里,key=value 对指定音量选项。我对参数type特别感兴趣。

  • 绑定
  • 音量
  • tmpfs

当我使用时,Docker 会创建哪种类型(以及如何指定它?)

Dockerfile

VOLUME /etc/nginx

我想看看docker volume ls /etc/nginx

然后我可以使用另一个带有—-from-volume 的容器来访问它。我错过了什么?

文档只说明启动容器时必须指定挂载点。

主机目录在容器运行时声明:主机目录(挂载点)本质上是依赖于主机的。这是为了保持图像的可移植性,因为不能保证给定的主机目录在所有主机上都可用。因此,您不能从 Dockerfile 中挂载主机目录。 VOLUME 指令不支持指定 host-dir 参数。创建或运行容器时必须指定挂载点。

这个问题可以改写为:如何将https://docs.docker.com/storage/volumes/ 与 Dockerfile 关联起来?

(我完全知道让 Docker 守护程序管理器成为一个卷而不是使用绑定挂载的好处。这是我的意图)

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:

    Dockerfile 中的 VOLUME 指令创建了一个绑定安装在容器中的匿名卷。有关其他信息,请参阅。 storage doc:“除了名称之外,命名卷和匿名卷的行为方式相同”。示例:

    FROM ubuntu:18.04
    
    VOLUME ["/src"]
    RUN mkdir /src && \ 
        touch /src/file.txt
    

    构建映像:docker build --rm -t so:57703848 . 并运行容器:docker run --rm --name mycontainer -it --entrypoint cat -d so:57703848(设置 cat 以保持容器在后台运行,仅用于示例目的)。

    现在您可以使用--volumes-from 将卷从mycontainer 绑定到另一个容器:docker run --rm -it --volumes-from mycontainer ubuntu:18.04

    注意:“匿名卷在首次挂载到容器时没有明确的名称,因此 Docker 给它们一个随机名称,保证在给定的 Docker 主机中是唯一的。” - docker volume ls 可能会出现,即:ccb199ae1396c2b9d49acc58559c739bd40b2ef37af50191fa3600ab6552fb20(随机生成)。您可以将命名卷挂载到 run 中的匿名卷,即:docker run --rm --name mycontainer -v myvolume:/src -it --entrypoint cat -d so:57703848--volumes-from 的工作方式相同,docker volume ls 将输出 myvolume

    【讨论】:

    • 这就是我想要的。我正准备开始阅读 Go 源代码...
    • 很高兴我能提供帮助 - 编辑了有关命名匿名卷的注释。
    • 我希望 Docker 的文档如此精确。 Docker 通常有很好的文档。 (不想对他们太苛刻)
    • 我倾向于同意,起初我对一般的卷感到非常困惑。当我发现在一天结束时,“docker 卷”只不过是在 /var/lib/docker/volumes 中创建的目录,这些目录是绑定挂载的,就像使用 -v 标志一样,事情真的开始点击了。
    • 顺便说一下,您可能希望将 VOLUME 指令移到 RUN 之后。我认为 VOLUME 正在创建路径,如果它不存在,mkdir 正在尝试再次创建它。
    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多