21

我已经搜索了文档,但没有任何结果,所以有时间测试它。但为了将来快速参考...

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

是不是相反?

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

还是会产生错误?该错误是在启动时引发的,还是在您尝试使用指向容器上现有填充文件夹的 VOLUME 构建图像时引发的?

另外,文档中没有的另一件事:我是否必须在 Dockerfile 中将容器路径定义为 VOLUME 以便在启动容器时使用 -v 来对抗它,或者我可以动态创建卷?

4

2 回答 2

32

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

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

于 2016-09-22T19:43:29.557 回答
7

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

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

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

不需要在 Dockerfile 中预先定义卷VOLUME;allVOLUME会导致从映像运行的任何容器在-v /volume/path其命令中添加一个隐式(注意缺少主机安装路径)参数docker run,如果使用显式,则该参数将被忽略-v /host/path:/volume/path

于 2016-09-22T19:40:52.050 回答