国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【docker】 bind-mount或者COPY時需要注意 用戶、文件權限 的問題

muddyway / 1571人閱讀

摘要:問題產生原因最近在使用的時候經常遇到權限問題。如果權限不夠,就會出現問題。從上圖可以看到,主進程的擁有者是,可以讀寫任何文件,權限肯定沒問題。要解決這個問題,其實就是讓用戶有權讀寫以及其中的文件。

問題產生原因

最近在使用docker的時候經常遇到權限問題。
通過這個stackoverflow回答,我明白了問題出現的主要原因:Docker在進行bind mount的時候,或者在進行COPY的時候,會保持文件的權限比特位(比如755)、owner ID(比如1000)、group ID(比如1000)與宿主機器上的來源文件相同。而【docker容器主進程的owner ID】(比如www-data(33))往往與【宿主機器上的文件的owner ID】(比如xiaoming(1000))不一樣。如果【docker容器主進程的owner】沒有權限讀/寫這個文件,那么bind-mountsCOPY到容器內的文件就不會產生我們預想的效果(比如配置文件無法被容器進程讀取、寫入)。

如果沒有時間查看下面的最佳解決方案,可以試試這個簡單粗暴的解決方案:在宿主機器上,通過sudo chmod -R 777 /path/to/dir被掛載的目錄的權限比特位設為777。這樣,這個目錄就能被任何用戶讀寫,包括【docker容器主進程的owner】。但是這個方法可能會造成安全隱患,另外,git會將權限改動也視為文件變動(需要設置一下git來解決)。
實例:判斷問題 查看宿主上的權限信息

使用上一篇博客介紹的查看信息命令,在宿主機器上,檢查被bind-mount或者被COPY的文件的權限信息:權限比特位(比如755)、owner ID(比如1000)、group ID(比如1000)。

查看容器內的權限信息

通過以下命令,在指定容器內運行一個bash:

docker exec -it container_name /bin/bash

進入容器的bash以后,你就可以再次使用上一篇博客的查看信息命令,來查看容器中的進程、文件、用戶信息了:

你可以驗證一下被bind-mount、COPY的文件,它們的權限信息是否與宿主上的相同:權限比特位、owner ID、group ID。

然后,你應該通過ps aux來查看【容器主進程】的owner用戶是誰(如果沒有ps命令的話按照上一篇博客的指示來安裝),這個owner就是需要訪問文件的用戶,這個用戶的權限決定了這個進程是否有權訪問【我們bind-mount、COPY到容器中的文件】。如果權限不夠,就會出現問題。

從上圖可以看到,主進程的擁有者是rootroot可以讀寫任何文件,權限肯定沒問題。但是主進程還創建了兩個子進程,擁有者是www-data,這個用戶有可能無法讀寫【被bind-mount或者COPY到容器內的文件】!

因此,現在我們需要檢查www-data是否存在權限不足的問題,首先通過id username來查看這個用戶的 user id、primary group id、加入的所有群組 的信息:

然后,使用stat或者ls -na命令,查看【被bind-mount或者COPY到容器內的文件】的權限信息:

上圖的/codeigniter文件夾是我通過bind-mount掛載到容器內的。可以看到這個文件夾以及其中的文件的ownerId:groupId都是1000:1000,而www-dataownerId:groupId33:33。再結合這些文件的權限信息(比如-rw-rw-r--drwx------),www-data只能讀取其中一些文件,無法寫入任何文件,/codeigniter/application/這個文件夾內的內容連訪問都不行!

如上圖,用stat也能看到同樣的文件信息,只不過一次只能看到一個文件或文件夾的信息。

【容器主進程】有可能會創建其他的進程一起工作(比如上面的例子),如果是這樣的話,你需要檢查所有子進程都有權訪問自己所需的文件。

上面的例子中,/codeigniter以及其中內容的權限比特位、owner ID、group ID都與我的宿主機器上的codeigniter文件夾相同(我登陸ubuntu的賬戶的userid就是1000)!保持文件的元數據(filesystem metadata)是docker的一個特點,也是一個坑點。

實例:解決問題

既然知道了問題的成因,那么我們就可以想辦法解決它了。
要解決這個問題,其實就是www-data用戶有權讀寫/codeigniter以及其中的文件

有兩個思路:

改變www-data的uid和gid,從33:33變成1000:1000。這樣www-data就是這些文件的owner了,自然就有需要的權限了。改變uid和gid可以通過我上篇文章介紹的usermod命令。具體來說,就是在Dockerfile中加入這樣一句:RUN usermod -u 1000 www-data && usermod -G 1000 www-data。(其實不需要改gid的,改uid就可以成為owner了)

改變容器內/codeigniter的權限信息,使得www-data(33:33)有權讀寫它:

通過chmod命令,在宿主機器上改變codeigniter文件夾的權限比特為777。這樣,在bind-mount到容器里面以后它的權限也是777,因此任何用戶都可以讀寫它的內容。這個方法要求修改開發環境,不太優雅。

在構建image時,將所有需要的文件COPY到鏡像內,然后通過Run chmod 777 -R /codeigniter使得www-data獲得讀寫權限,或者Run chown www-data:www-data -R /codeigniter使得www-data成為owner。

實際上COPY --chown=www-data:www-data ./codeigniter /codeigniter/就能一步將【被COPY的文件】的owner設置為容器內的某個用戶。

我認為Run chmod 777 -R /codeigniter這個解決方案是最方便省事的。

但是我不太想chmod 777,我采用的是COPY --chown=www-data:www-data ./codeigniter /codeigniter/的方案,我喜歡這種方案,因為它只做恰到好處的修改,不多不少。要用好這個方案,我們需要知道被COPY的文件會被哪些進程訪問、這些進程的onwer分別是誰

使用這個方案以后的結果:


www-data用戶的進程可以讀寫這些文件了!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27332.html

相關文章

  • 【linux】與 用戶權限 有關常用命令

    摘要:同理,對于用戶群組的刪除,分別有和,它們的也是一模一樣的。修改已有用戶用戶組修改已有用戶用戶組有關的工作,分別交給以下兩個命令對于,比較常用的參數有,它們分別修改用戶的主群組額外加入的群組用戶。要切換當前用戶所登陸的群組,使用命令。 查看信息 查看文件、文件夾的filesystem metadata # 查看**單個**文件、文件夾的權限信息 stat filename # 或者使用以...

    Zhuxy 評論0 收藏0
  • 使用 syslog 處理多個 Docker 容器日志

    摘要:可運行的和基礎的指令已經在一個小型的倉庫里。然后我們可以啟動任何容器,到容器里面去對于一個教育示例,你可以這樣做容器將把日志消息發送到,其實際是通過創建。你可以通過使用運行另外一個容器來查看日志,以及檢查在里面的文件。 注:該文作者 jpetazzo,該文章的原文為 Multiple Docker containers logging to a single syslog 這...

    moven_j 評論0 收藏0
  • Docker Volume 之權限管理(轉)

    摘要:發現問題之后,相應的解決方法也很簡單把當前目錄的擁有者賦值給,再啟動容器就一切正常了。這時我們已經可以知道容器的本地數據卷中文件目錄的權限是和宿主機上一致的,只是在容器和宿主機中可能映射為不同的用戶組名稱。 Volume數據卷是Docker的一個重要概念。數據卷是可供一個或多個容器使用的特殊目錄,可以為容器應用存儲提供有價值的特性: 持久化數據與容器的生命周期解耦:在容器刪除之后數據卷...

    sf190404 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<