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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章