【问题标题】:Does docker run -v or Dockerfile VOLUME take precedence?docker run -v 还是 Dockerfile VOLUME 优先?
【发布时间】:2017-02-06 02:05:51
【问题描述】:

Dockerfile

FROM nginx:1.7

# Deliberately declaring VOLUME before RUN
VOLUME /var/tmp

RUN  touch /var/tmp/test.txt

观察

现在我相信我理解之前声明 VOLUME 语句的含义了 创建test.txt - 运行时暴露的卷/var/tmp 将基于创建test.txt 文件之前的中间容器,因此它将为空(希望这个观察是正确的)

所以正如预期的那样,下面的docker run 没有显示test.txt

docker run kz/test-volume:0.1

但后来我尝试在运行时提供音量如下:

docker run -v /var/tmp kz/test-volume:0.1

问题

结果是一样的。那么这是什么意思? docker run 命令中的-v /var/tmp 是否映射到Dockerfile 中VOLUME 命令公开的空/var/tmp 目录,而不是最新映像中带有test.txt/var/tmp 目录?

感觉有点迷茫。

【问题讨论】:

    标签: docker dockerfile docker-volume docker-image


    【解决方案1】:

    没有包含/var/tmp/test.txt 的图像。在创建文件之前声明卷的效果是RUN 指令在一个临时容器中运行,该容器具有自己的卷。 Volumes bypass the Union File System 因此,当构建保存该中间容器时,卷的内容不会保存,因此它们不会持久保存在映像层中。

    您从该映像创建的每个容器都有自己的卷,-v 选项不会改变这一点,除非您使用它将卷映射到主机路径。

    使用您的 Dockerfile,您可以通过检查两个容器来看到这一点。第一个没有-v 选项:

    > docker run -d temp                                                                                              
    c3c4f7de411f166b3a67397ff1221552fe5b94c46bc100725a50a57231da427b                                                  
    
    > docker inspect -f '{{ .Mounts }}' c3c                                                                           
    [
        {67267d2eeb57373f76a9dd50c25f744b7d99d0a75647bf06aa0d17b70807cf71/var/lib/docker/volumes/67267d2eeb57373f76a9dd50c25f744b7d99d0a75647bf06aa0d17b70807cf71/_data /var/cache/nginx local  true }
        {91490ea73e3a9d42df9f00e32a91fe571d2143f54248071959765d5d55c23d46/var/lib/docker/volumes/91490ea73e3a9d42df9f00e32a91fe571d2143f54248071959765d5d55c23d46/_data /var/tmp local  true }
    ]  
    

    这里有两个卷,从主机上的/var/lib/docker 挂载。一个来自nginx 基础镜像,一个来自您的镜像。使用明确的-v

    > docker run -d -v /var/tmp temp                                                                                  
    6fa1a8713b2d6638675a3d048669943419bc7a3924ed98371771100bcfde3954 
    
    > docker inspect -f '{{ .Mounts }}' 6fa                                                                           
    [
        {9adf6954ed3e826f23a914cbbd768753e6dec1f176eed10e03c2d5503287d101/var/lib/docker/volumes/9adf6954ed3e826f23a914cbbd768753e6dec1f176eed10e03c2d5503287d101/_data /var/cache/nginx local  true } 
        {7dd8be71ce88017ffbeef249837bdd1c96c071b802a2f43b18fd406983e1076a/var/lib/docker/volumes/7dd8be71ce88017ffbeef249837bdd1c96c071b802a2f43b18fd406983e1076a/_data /var/tmp local  true }
    ]  
    

    结果相同,但主机路径不同,因为每个容器都有自己的卷。

    【讨论】:

    • 谢谢。我觉得我对缺少的“卷绕过联合文件系统”有部分理解。这意味着即使最终图像也没有您指出的 test.txt 文件。去说明为什么你应该先坚持,然后将它作为一个卷公开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    相关资源
    最近更新 更多