做者: 張首富 時間: 2020-05-09 晚 w x: y18163201
今天上午開發給我反應一個問題,所在宿主機上更改了掛載的文件在 docker 裏面看不到改變,問我是否是 docker 啓動的時候掛載的時候有問題,我說不可能啊,怎麼會有問題呢?因而本身親自測試了一下,發現確實外面改完以後裏面不生效.本覺得是這臺機器特殊有問題(由於我用 docker 兩年了歷來沒有注意過這個問題),而後就換了個機器,發現仍是同樣,因而重視這個問題,看看究竟是由於什麼?node
啓動一個 docker 掛載一個文件 和掛載一個目錄linux
mkdir -p /home/zsf/volume echo "test" >> /home/zsf/test.txt docker run -id --name test_volume -v /home/zsf/volume:/root/volume -v /home/zsf/test.txt:/root/test.txt busybox
而後咱們測試下在 docker 裏面能不能看到外面掛載的 test.txt 文件裏面的內容nginx
[root@test zsf]# docker exec -it test_volume cat /root/test.txt test
發現咱們能看到外面這個文件的信息,咱們經過 vim/vi 在宿主機上編輯 test.txt 文件docker
[root@test zsf]# vim test.txt [root@test zsf]# cat test.txt test test02 test03
而後咱們在到 docker 裏面看看咱們新增的這兩行有沒有進去vim
[root@test zsf]# docker exec -it test_volume cat /root/test.txt test
發現咱們在外面更改的文件裏面並未生效,那究竟是什麼地方出問題了呢?當時想咱們要否則重啓下這個容器試試呢?bash
[root@test zsf]# docker restart test_volume test_volume [root@test zsf]# docker exec -it test_volume cat /root/test.txt test test02 test03
發現重啓以後,外面修改的內容在 docker 裏面能看到了,那難道咱們每次在外面改完文件都要必須重啓在 docker 裏面才能看到嗎? 我認爲 docker 是不會把這種不合理的問題流傳到如今(好比咱們更改完 nginx 的配置文件,須要 docker restart nginx,而不是用 nginx -s reload 嗎?)我認爲確定不是這樣的,必定是有什麼緣由形成了這種現象.因而繼續作實驗.
更改文件的方式又不是隻有 vim 這一種方式,咱們嘗試下別的方法會不會有這種問題,咱們用 sed/cat/echo
改變文件去看看會不會在 docker 裏面立馬生效ide
[root@test zsf]# echo "test04" >> test.txt [root@test zsf]# docker exec -it test_volume cat /root/test.txt test test02 test03 test04
發現用 echo 追加進去就立馬生效了,那咱們再試試 cat 和 sed測試
[root@test zsf]# cat >> test.txt <<-'EOF' > test05 > EOF [root@test zsf]# docker exec -it test_volume cat /root/test.txt test test02 test03 test04 test05 [root@test zsf]# sed -i "s#test#zsf#g" test.txt [root@test zsf]# docker exec -it test_volume cat /root/test.txt test test02 test03 test04 test05 [root@test zsf]# cat test.txt zsf zsf02 zsf03 zsf04 zsf05
從上面實驗來看 echo 和 cat 追加進去都正常,可是 vim 和 sed 不正常,那麼咱們就大概能知道問題出在哪了,由於熟悉 linux 的夥伴們都知道,linux 系統是不區分文件格式的,linux 之間文件的關係是靠 inode 來決定的,而並不是文件名,因此這個問題會不會是 inode 搞得鬼呢?
咱們來回想下 vim 的工做原理:rest
1,輸入 vim 編輯文件
2,系統開始檢查文件同級目錄下有沒有 .FileName.swp的文件
有: 會提示報錯信息
無: 直接打開文件,同時產生這麼一個臨時的隱藏文件
3,而後咱們開始編輯這個文件,其實這個時候咱們全部的操做在咱們沒執行保存操做的時候,咱們都在操做的是 .FileName.swp 這個文件,
4,當咱們輸入保存操做的時候, .FileName.swp 文件會把之前的 FileName 文件覆蓋掉code
在咱們回顧完 vim 的工做模式以後這個問題其實就很好理解了,由於咱們 vim 更改文件以後 inode 變了,可是 docker 裏面使用的仍是之前的 inode ,這個時候其實裏面和外面只是兩個文件名稱同樣的不一樣文件罷了,
當咱們重啓以後這個對應關係又再一次創建起來了,因此咱們看到裏面和外面的文件保持一致了
問題致使是查出來是什麼緣由了,可是咱們實際上想解決的問題仍是沒辦法解決啊,我這個時候想起有的時候以一樣的方式 vim 更改文件內容,爲何更改完以後 docker 裏面能立馬生效了呢? 因而繼續作實驗
我給這個文件 777 權限以後,看看他有什麼變化
chmoe 777 test.txt
咱們裏面的東西幾乎所有清空了,可是我發現一個我不知道的事情,爲何文件給了 777 權限以後,一樣使用 vim 更改內容 他的 inode 號就不變了呢?(事情到此實際上已經找到我問題的解決方案了),可是咱們碰到本身不會的東西要搞清楚啊,接着查閱資料
實驗截圖以下疑問: 爲何同時都是用 vim 編輯的文件,777 權限和 644 權限的結果大相徑庭呢? 望哪位大佬看見能給解釋一波,萬分感謝?