docker运行-v或Dockerfile VOLUME优先?

Dockerfile

FROM nginx:1.7 # Deliberately declaring VOLUME before RUN VOLUME /var/tmp RUN touch /var/tmp/test.txt 

意见

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

因此,正如预期的那样,以下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目录?

感觉有点困惑。

没有包含/var/tmp/test.txt图像。 在创build文件之前声明卷的效果是, RUN指令运行在具有自己卷的临时容器中。 卷绕过联盟文件系统,所以当构build保存该中间容器时,卷的内容不会保存 ,所以它们不会保留在图像层。

您从该映像创build的每个容器都将拥有自己的卷, -v选项不会更改该卷,除非将其用于将卷映射到主机path。

使用你的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 } ] 

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