docker -v :rw :ro

先引用官方文档原话:If neither ‘rw’ or ‘ro’ is specified then the volume is mounted in
read-write mode.(https://docs.docker.com/engine/reference/run/#volume-shared-filesystems
官方文档说不指定的时候默认是rw模式。
用docker inspect查看容器的属性,可以看到关于挂载目录的详细参数,格式如下:
“Mounts”:
{
“Type”: ,
“Source”: ,
“Destination”: ,
“Mode”: ,
“RW”: ,
“Propagation”:
}
1. 默认情况不使用:rw :ro选项,Mode的值就是空字符串”“。
2. 使用:rw选项,Mode的值就是”rw”。
3. 使用:ro选项,Mode的值就是”ro”。
我们知道docker -v不仅可以挂载映射目录,也可以只挂载映射一个文件。
1. 如果我们按照1,2设置来挂载目录,宿主主机和docker互相都可以读写同步,如果我们按照1,2设置来挂载文件,这个时候只有docker的写可以同步到宿主主机上面去,宿主主机写不同步到docker。而且一旦宿主主机上写了修改了映射文件,那么docker里面再怎么写都不再同步到宿主主机了。
注意:这里有一个特殊的玩法,假如docker1和docker2都映射了主机上同一个文件到自己的目录,在docker1里面改了文件,docker2内也是同时改变的,就算你在主机上改了文件导致主机和docker1,docker2不再同步了,这个操作还是可以。
2. 如果我们按照3来挂载目录或者挂载文件,这个时候docker内也不能写,宿主主机写了也不同步进去了,相当于创建的时候拷贝一份不可改变的配置进来而已。
官方文档中有这样一段话:
Note: Many tools used to edit files including vi and sed –in-place may result in an inode change. Since Docker v1.1.0, this will produce an error such as “sed: cannot rename ./sedKdJ9Dy: Device or resource busy”. In the case where you want to edit the mounted file, it is often easiest to instead mount the parent directory.
确实,我们在docker内部运行程序使用shell的sed修改映射文件内容的时候会报错Device or resource busy,我的做法是每次cp一个临时文件出来,然后修改这个临时文件,最后cp -f 强制替换这个映射文件,官方建议我们最好还是用映射目录的方式来互相同步修改。

发布了68 篇原创文章 · 获赞 74 · 访问量 17万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章