2017-10-17 65 views
0

我有一個基於碼頭的構建環境 - 爲了構建我的項目,我運行了一個具有--volume參數的碼頭容器,因此它可以訪問我的項目目錄並構建它。使碼頭容器寫入主機可以刪除的文件

問題是容器創建的文件不能被主機刪除。我目前唯一的解決方法是啓動一個包含目錄的交互容器並將其刪除。

底線問題:有可能讓docker寫入已加載的區域文件,使主機可以稍後刪除它們嗎?

+0

運行帶有'-e LOCAL_USER_ID ='id -u $ USER''工作的容器嗎? – SomethingSomething

回答

1

這與Docker有關,而且更多的是與基本的Unix文件權限有關。您的碼頭箱容器的運行方式爲root,這意味着由容器創建的任何文件都由主機上的root所有。您可以通過以下方法解決此問題:(a)確保文件/目錄是使用用戶標識創建的;(b)確保權限允許您刪除文件,即使它們不是(c)使用提升的權限(例如sudo rm ...)刪除文件。根據你在做什麼,選項(a)可能很容易。如果你可以運行contanier作爲非root用戶,e.g:

docker run -u $UID -v $HOME/output:/some/container/path ... 

...那麼一切都將只是工作,因爲這些文件將與您的用戶ID創建。

如果容器必須爲root最初運行時,您可以採取的在你的ENTRYPOINTCMD腳本root行動護理,然後切換到另一個UID運行的主要應用。要做到這一點,你需要你的用戶ID傳遞到容器(例如,作爲一個環境變量),再後來使用類似runuser切換到新的用戶ID:

exec runuser -u $TARGE_UID /some/command 

如果沒有上述的是一個選項,那麼sudo rm -rf mydirectory應該像旋轉互動容器一樣工作。

+0

感謝您提供非常詳細和解釋的回覆! – SomethingSomething

0

如果您需要構建工件以將它們放到下一個階段的泊塢窗圖像上,那麼可能值得使用multi-stage build選項。

相關問題