Contents
Docker的volumes踩坑
转载来源: https://biningo.github.io/2021/01/07/docker%E7%9A%84volumes%E8%B8%A9%E5%9D%91/ 参考2: https://www.dltlabs.com/blog/bind-mounts-volumes-indocker-133067 参考3:https://www.atatus.com/blog/docker-volumes-vs-bind-mounts/
挂载volume的行为
volume
的挂载是 以宿主机为主 ,主要有如下几个行为可能:
host | container | mount result |
---|---|---|
文件夹不存在/文件夹存在但为空 | 文件夹不存在/存在但为空/存在且不为空 | container中文件被覆盖(清空) |
文件夹存在且不为空 | 文件夹不存在/存在但为空/存在且不为空 | container中文件夹内容被覆盖(原内容清空, 覆盖为host上文件夹内容) |
将容器已经存在的文件挂载到宿主机
由上面可知,容器中原本存在的文件一旦进过挂载,就一定会被宿主机覆盖,但是有如下几个方法,可以曲线救国:
- docker cp命令先将容器内的数据copy到宿主机然后再进行挂载
- 在
docker-entrypoint.sh
等脚本中执行创建文件和文件夹等相关命令,因为挂载行为先与脚本的执行行为,所以在脚本执行的时候已经挂载volume,当脚本创建相关文件的时候就可以反映到宿主机上了
volume相关命令
共享数据卷
一个容器可以共享其它容器已经挂载了的数据卷,一旦共享那么只要在任意一个容器里面操作数据卷都相当于操作同一个,会影响所有容器和宿主机上的文件。并且容器删除并不会删除数据卷
docker run --name b1 -v $PWD:/v1 -it busybox:1.32.0 sh docker run --name b2 --volumes-from b1 -it busybox:1.32.0 sh
volume权限问题
TODO
volume规则总结
- 应该避免挂载一个空的或未创建的目录,这样可能会清空容器中原来存在的文件
- 如果挂载一个没有创建的文件,则docker会自动创建
- docker挂载路径容器和宿主机不支持 相对路径 ,都必须指定 绝对路径
参考
https://www.ucloud.cn/yun/27376.html
发表回复