docker 运行 -v 或 Dockerfile VOLUME 优先吗?
Does docker run -v or Dockerfile VOLUME take precedence?
Docker 文件
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 运行 命令中的 -v /var/tmp
是否映射到 Dockerfile 中 VOLUME
命令公开的空 /var/tmp
目录,而不是 /var/tmp
最新图像中包含 test.txt
的目录?
感觉有点迷糊。
没有包含 /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 }
]
结果相同,但主机路径不同,因为每个容器都有自己的卷。
Docker 文件
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 运行 命令中的 -v /var/tmp
是否映射到 Dockerfile 中 VOLUME
命令公开的空 /var/tmp
目录,而不是 /var/tmp
最新图像中包含 test.txt
的目录?
感觉有点迷糊。
没有包含 /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 }
]
结果相同,但主机路径不同,因为每个容器都有自己的卷。