我搜索了文档,但没有出现。我知道我可以测试它,但我感觉很懒,所以为了将来的参考和任何想要展示他们的专业知识并赢得一些SO代表的人......
主机文件夹是否填充了容器文件夹内容?
是相反吗?
两个文件夹内容是否合并? (在这种情况下:当两个文件夹中有同名文件时会发生什么?)
或者是否会产生错误?是否在启动时抛出错误,或者当您尝试使用指向容器上现有填充文件夹的VOLUME构建映像时抛出该错误?
另外,文档中没有其他内容:我是否必须在Dockerfile中将容器路径定义为VOLUME,以便在启动容器时对其使用-v,或者我可以在飞?
答案 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}}。