Docker运行-v或Dockerfile VOLUME优先吗?

时间:2016-09-28 08:11:55

标签: docker dockerfile docker-volume docker-image

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中/var/tmp命令公开的空VOLUME目录而不是/var/tmp test.txt目录中的java.sql.Timestamp目录在最新的图像?

感到有点困惑。

1 个答案:

答案 0 :(得分:2)

没有包含/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 }
]  

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