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 強制替換這個對映檔案,官方建議我們最好還是用對映目錄的方式來互相同步修改。