1. 程式人生 > 實用技巧 >docker掛載單檔案問題

docker掛載單檔案問題

轉載自https://www.cnblogs.com/ZYTZ/p/13047948.html

關於docker中資料夾掛載成功 但是單檔案掛載卻沒有生效的問題

因為用vim修改這裡會有一個坑

docker -v mount 的機制:

-v mount 檔案(或資料夾)時,docker 記錄的是該檔案的 inode,並用 inode 追蹤。當用 vim 編輯了檔案後,這個檔案的 inode 就變了,也就是說這個 default.conf 檔案已經不是執行 docker run 時的那個 default.conf 檔案了,容器中自然也就沒了新的改動。 同時該 issue 的 opener 使用的是 sed -i 修改,也會使 inode 發生變化,sed -i 的機制是建立一個新的臨時檔案,修改完後在重新命名。對此,官方的建議是掛載資料夾,而不是檔案。

https://github.com/moby/moby/issues/6011
上面這段參考:https://www.dazhuanlan.com/2020/01/02/5e0d7cfd57df8/

經測試發現,我掛載單檔案的nginx的container,沒重啟之前修改掛載的單檔案沒有生效,但重啟之後修改的配置檔案確實會更新,對於nginx來說配置更新本身就需要重啟,所以掛載檔案其實也可以。
但對於那些需要修改單檔案但又想不重啟container,
就可以實現更新的情況可以考慮掛載資料夾。我這裡改為掛載資料夾。

//這裡是掛載單檔案,有坑,宿主機改配置後容器中配置沒有修改,後面是掛載目錄方式

root@Colin:~/web2# docker run --name web2 -d -p 80:80 --net host -v $(pwd)/config/html:/usr/share/nginx/html -v $(pwd)/config/conf/nginx.conf:/etc/nginx/nginx.conf -v $(pwd)/config/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v $(pwd)/config/logs:/var/log/nginx fansolomon/my-nginx

//先將檔案從web2 container(我之前執行的一個nginx容器)相關配置檔案copy到本地機config目錄下,html目錄也是同理,還有需要新建logs目錄

root@Colin:~/web3# docker cp web2:/etc/nginx config

//完成copy後目錄如下

root@Colin:~/web3/config# ls
html  logs  nginx
root@Colin:~/web3/config/nginx# ls
conf  conf.d  fastcgi_params  koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params  uwsgi_params  win-utf

//然後重新建立一個web3 container,將單檔案掛載改為目錄掛載!

root@Colin:~/web3# docker run --name web3 -d -p 80:80 --net host -v $(pwd)/config/html:/usr/share/nginx/html -v $(pwd)/config/nginx:/etc/nginx -v $(pwd)/config/logs:/var/log/nginx fansolomon/my-nginx

//再修改宿主機web3資料夾中的config中配置,可以看到容器中的配置跟著更新了,成功
//進入/usr/sbin/後進行reload重新載入配置檔案 可以看到修改已經生效