2017-08-12 60 views
1

我遇到了一個奇怪的問題:我從一個主機到RW模式的容器掛載文件,然後我編輯此文件主機但它沒有在容器中更新。主機和內部容器上的相同文件是不同的,它不是與其原來的同步

這是從docker inspect <container>的輸出的提取物:

"Mounts": [ 
    ... 
    { 
     "Type": "bind", 
     "Source": "/home/a_user/projects/drupal/d8-default/composer.json", 
     "Destination": "/var/www/d8-default/composer.json", 
     "Mode": "rw", 
     "RW": true, 
     "Propagation": "" 
    }, 
    ... 
] 

您可能看到,該文件被安裝爲讀寫模式作爲一個單獨的安裝。現在,當我在主機上編輯它時,它不會在容器中更改。我通過登錄容器並在其外部進行簡單的cat composer.json來看到這一點。

我和隨機文件進行額外的測試,這裏是我發現:

  1. 如果正在編輯位於一個目錄(安裝在RW模式)的文件,然後更改立即出現在其容器的副本。

  2. 如果一個文件被直接掛載,那麼根本不會傳輸更改,看起來容器似乎正在維護它自己的文件版本!

事實上,這是非常不受歡迎的行爲,它打破了我的工作流程,我還沒有找到克服這種不一致的解決方案。歡迎任何建議。

回答

1

將單個文件掛載到容器中時,掛載的是Linux文件系統上文件的inode。如果替換文件(許多編輯器都這樣做),那麼inode會更改。如果掛載整個目錄,通常這不是問題,因爲目錄指向inode的指針得到更新。但是當只安裝一個文件時,啓動容器後寫入文件將不會在容器的內部和外部之間反映出來。

有關詳細信息,請參閱此問題:https://github.com/moby/moby/issues/6011


編輯:如果你的目標是修改文件的容器外,並有修改一個文件中的文件的目錄,可以」那麼我建議將容器更改爲在不同目錄中的文件的符號鏈接,以便裝入整個目錄而不是單個文件。這將是這樣的:

在你Dockerfile:

RUN mkdir -p /var/docker/composer \ 
&& ln -s /var/docker/composer/composer.json /var/www/d8-default/composer.json 

而且卷裝入然後將:

docker run -v /home/a_user/projects/drupal/d8-default:/var/docker/composer ... 
+0

是的,謝謝。我也發現這個討論:https://unix.stackexchange.com/questions/44373/single-bind-mounted-file-gets-out-of-sync-in-linux 我的解決方法是停止使用file-我一直在重新構建我的項目的結構以僅使用目錄裝載。 – Onkeltem

相關問題