簡體   English   中英

嘗試以非root用戶身份從容器內部寫入已裝入的卷時出現問題

[英]Issue when trying to write to a mounted volume from inside a container as a non-root user

我正在使用一個將運行ZooKeeper的容器,但是我遇到了關於我裝入容器的主機卷的權限問題。

這是我的設置:

在主機上(Ubuntu 14.04):

  • 創建了“zookeeper”系統用戶(id = 106)和組(id = 111)。
  • 創建目錄“/ var / log / zookeeper”並將其所有權設置為zookeeper(即chown zookeeper:zookeeper)。 這是我將安裝到容器中的目錄。

容器內部(Ubuntu 14.04):

  • 還創建了一個“zookeeper”系統用戶(id = 102)和group(id = 105),我將其用作在ENTRYPOINT中執行命令的用戶。
  • 創建將要掛載的相同目錄“/ var / log / zookeeper”,並將其所有權設置為zookeeper:zookeeper(雖然我認為這不重要)。

一旦我使用/ var / log / zookeeper mount啟動我的容器,我在容器內部打開一個shell作為zookeeper用戶(在容器內創建),我發現我得到一個“Permission Denied”錯誤,如果我嘗試在掛載目錄/ var / log / zookeeper中創建一個文件。 當我執行“ls -l”查看此目錄的所有權(仍然在容器內)時,它看起來像這樣:

drwxr-xr-x 2  106  111   4096 Jun 30 17:18 zookeeper

在這種情況下,106和111對應於主機的zookeeper用戶和組ID,我認為這是問題所在。 我嘗試在容器內部打開一個shell,但這次我以root用戶身份進入,上面描述的場景完全正常,只是root是創建的文件的所有者(這是預期的)。

由此我得出結論,我需要:

(a)在我的容器內運行應用程序作為默認的root用戶,而不是我創建的zookeeper用戶。

(b)在我的主機上和id完全相同的容器內創建一個zookeeper用戶和組。

這兩種情況都不理想,因為對於(a) ,以root用戶身份運行應用程序可能會產生潛在的安全問題(無論如何我都讀過),對於(b) ,要使id匹配到期是非常困難的事實上,他們可能已被其他已創建的用戶(您無法控制)使用。

有沒有人曾經處理過這樣的事情? 我可能會忽略其他可能的解決方案嗎?

據我所知,容器內和主機上的用戶ID和組ID應該匹配,以便讓主機授予您對共享目錄的權限。

查看運行生產開發容器之間的區別非常重要。 Afaik,如果您的Docker容器以root身份運行,即使在生產中也沒有真正的問題。 但是,您永遠不應該或者需要安裝大量的生產。 如果您想以動物園管理員的身份運行它,請隨意這樣做。

//編輯:我讀的越多,我就越相信在以root身份運行東西時可能存在安全問題,所以最好不要在生產中這樣做。

嘗試匹配uidgid的解決方案僅適用於小型/本地項目 - 它確實使其無法移植。 您可以嘗試設置任意高的uidgid ,然后在每台開發機器上執行相同操作,但這並不意味着它總是很好。

tl; dr開發時在現有文件上運行chmod -R 0777 ,然后使用umask 0000來設置稍后創建的文件和目錄的權限。 然后,無論用戶創建文件,您都可以隨意安裝和編輯文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM