docker 掛載文件不同步問題記錄

docker 掛載文件不同步問題記錄

作者: 張首富
時間: 2020-05-09 晚
w x: y18163201

起因

今天上午開發給我反應一個問題,所在宿主機上更改了掛載的文件在 docker 裏面看不到改變,問我是不是 docker 啓動的時候掛載的時候有問題,我說不可能啊,怎麼會有問題呢?於是自己親自測試了一下,發現確實外面改完之後裏面不生效.本以爲是這臺機器特殊有問題(因爲我用 docker 兩年了從來沒有注意過這個問題),然後就換了個機器,發現還是一樣,於是重視這個問題,看看到底是因爲什麼?

測試流程

啓動一個 docker 掛載一個文件 和掛載一個目錄

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 文件裏面的內容

[root@test zsf]# docker exec -it test_volume cat /root/test.txt
test

發現我們能看到外面這個文件的信息,我們通過 vim/vi 在宿主機上編輯 test.txt 文件

[root@test zsf]# vim test.txt
[root@test zsf]# cat test.txt
test
test02
test03

然後我們在到 docker 裏面看看我們新增的這兩行有沒有進去

[root@test zsf]# docker exec -it test_volume cat /root/test.txt
test

發現我們在外面更改的文件裏面並未生效,那到底是什麼地方出問題了呢?當時想我們要不然重啓下這個容器試試呢?

[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 裏面立馬生效

[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 的工作原理:

1,輸入 vim 編輯文件
2,系統開始檢查文件同級目錄下有沒有 .FileName.swp的文件
有: 會提示報錯信息
無: 直接打開文件,同時產生這麼一個臨時的隱藏文件
3,然後我們開始編輯這個文件,其實這個時候我們所有的操作在我們沒執行保存操作的時候,我們都在操作的是 .FileName.swp 這個文件,
4,當我們輸入保存操作的時候, .FileName.swp 文件會把以前的 FileName 文件覆蓋掉

在我們回顧完 vim 的工作模式之後這個問題其實就很好理解了,因爲我們 vim 更改文件之後 inode 變了,但是 docker 裏面使用的還是以前的 inode ,這個時候其實裏面和外面只是兩個文件名稱一樣的不同文件罷了,
docker 掛載文件不同步問題記錄
當我們重啓之後這個對應關係又再一次建立起來了,所以我們看到裏面和外面的文件保持一致了
問題導致是查出來是什麼原因了,但是我們實際上想解決的問題還是沒辦法解決啊,我這個時候想起有的時候以同樣的方式 vim 更改文件內容,爲什麼更改完之後 docker 裏面能立馬生效了呢? 於是繼續做實驗
我給這個文件 777 權限之後,看看他有什麼變化

chmoe 777 test.txt

docker 掛載文件不同步問題記錄
我們裏面的東西幾乎全部清空了,但是我發現一個我不知道的事情,爲什麼文件給了 777 權限之後,同樣使用 vim 更改內容 他的 inode 號就不變了呢?(事情到此實際上已經找到我問題的解決方案了),但是我們碰到自己不會的東西要搞清楚啊,接着查閱資料
實驗截圖如下
docker 掛載文件不同步問題記錄
docker 掛載文件不同步問題記錄
疑問: 爲什麼同時都是用 vim 編輯的文件,777 權限和 644 權限的結果截然不同呢? 望哪位大佬看見能給解釋一波,萬分感謝?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章