關於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重新加載配置文件 可以看到修改已經生效