当一个卷链接到一个已经存在且有内容的主机和容器目录时会发生什么?

31

我已经搜索了文档,但没有找到任何内容,所以现在是时候测试一下了。但是为了快速参考...

主机文件夹是否由容器文件夹内容生成?

还是相反?

两个文件夹的内容是否合并? (在这种情况下:当两个文件夹中有相同名称的文件时会发生什么?)

或者会产生错误吗?错误是在启动时抛出还是在尝试使用指向容器上现有填充文件夹的VOLUME构建镜像时抛出?

另外,文档中没有提到的另一件事:我是否必须在Dockerfile中将容器路径定义为VOLUME才能在启动容器时使用-v对其进行挂载,还是可以即时创建卷?

2个回答

42
当您运行容器并从主机挂载一个卷时,在容器中看到的都是主机上的内容 - 卷挂载点位于主机目录,因此如果镜像中的目录中有任何内容,则会被绕过。

使用此Dockerfile中的图像:

FROM ubuntu
WORKDIR /vol
RUN touch /vol/from-container
VOLUME /vol

如果您在不使用宿主机挂载的情况下运行它,镜像内容将被复制到卷中:

> docker run vol-test ls /vol
from-container 

但如果从主机挂载卷,你只能看到主机的内容:

> ls $(pwd)/host
from-host
> docker run -v $(pwd)/host:/vol vol-test ls /vol
from-host

不,您不需要VOLUME指令。没有它的情况下行为是相同的。


9
每当使用主机上挂载了一个卷的Docker容器被创建时,例如:
docker run -v /path/on/host:/data container-image

由于镜像构建过程中已经存在于 /data 中的任何内容都将被完全丢弃,而当前位于 /path/on/host 的任何内容都将被代替。(如果 /path/on/host 不存在,则会创建为空目录,尽管我认为这种行为的某些方面可能已经被弃用。)
在 Dockerfile 中预定义 VOLUME 不是必需的;所有 VOLUME 所做的只是导致从镜像运行的任何容器都有一个隐式的 -v /volume/path(注意缺少主机挂载路径)参数添加到其 docker run 命令中,如果使用显式的 -v /host/path:/volume/path,则会忽略该参数。

当我们说被丢弃时,是指丢失了吗?如果之后进行卸载会怎么样? - mckenzm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接