当卷链接现有的填充主机和容器目录时会发生什么

时间:2016-09-22 19:28:42

标签: docker dockerfile volumes

我搜索了文档,但没有出现。我知道我可以测试它,但我感觉很懒,所以为了将来的参考和任何想要展示他们的专业知识并赢得一些SO代表的人......

主机文件夹是否填充了容器文件夹内容?

是相反吗?

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

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

另外,文档中没有其他内容:我是否必须在Dockerfile中将容器路径定义为VOLUME,以便在启动容器时对其使用-v,或者我可以在飞?

2 个答案:

答案 0 :(得分:10)

当您运行容器并从主机挂载卷时,您在容器中看到的只是主机上的内容 - 卷挂载指向主机目录,因此如果映像中的目录中有任何内容,绕过了。

使用此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指令。没有它,行为是一样的。

答案 1 :(得分:2)

每当创建Docker容器并在主机上安装卷时,例如:

docker run -v /path/on/host:/data container-image

由于图像构建过程而在/data中已经存在的任何内容总是被完全丢弃,并且当前在/path/on/host处使用的任何内容都被使用。 (如果/path/on/host不存在,则将其创建为空目录,但我认为该行为的某些方面目前可能已被弃用。)

不需要使用VOLUME在Dockerfile中预定义卷;所有VOLUME都会导致从映像运行的任何容器都有一个隐含的-v /volume/path(注意缺少主机挂载路径)参数添加到他们的docker run命令中,如果显式-v /host/path:/volume/path被忽略使用1}}。