docker 掛載文件不一樣步問題記錄

docker 掛載文件不一樣步問題記錄

做者: 張首富
時間: 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 ,這個時候其實裏面和外面只是兩個文件名稱同樣的不一樣文件罷了,
docker 掛載文件不一樣步問題記錄
當咱們重啓以後這個對應關係又再一次創建起來了,因此咱們看到裏面和外面的文件保持一致了
問題致使是查出來是什麼緣由了,可是咱們實際上想解決的問題仍是沒辦法解決啊,我這個時候想起有的時候以一樣的方式 vim 更改文件內容,爲何更改完以後 docker 裏面能立馬生效了呢? 因而繼續作實驗
我給這個文件 777 權限以後,看看他有什麼變化

chmoe 777 test.txt

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

相關文章
相關標籤/搜索