[Docker] 在 container 裡面存取 host 檔案遇到 Permission denied?

[Docker] 在 container 裡面存取 host 檔案遇到 Permission denied?

最近在用 docker 建立專案編譯的環境,

在 docker run 裡用 -v 指令將本地端的 ~/p4 目錄掛載到 container 裡的 /p4 使用,

好讓 container 裡面可以存取到外面的原始碼:

docker run -it -v ~/p4:/p4 testuser/build_prj /bin/bash

 

檔案掛載沒有問題,但是進到 container 裡面想要 ls 一下,

卻出現了 Permission denied 的問題:

root@b9f5a339508b /p4 # ls
ls: cannot open directory .: Permission denied

 

查了一下,原來是 SELinux 的影響:

Using Volumes with Docker can Cause Problems with SELinux

stackoverflow: Permission denied on accessing host directory in docker

 

要解決這個問題,在 -v 參數的最後面,加上 :z 或是 :Z,分別代表的是:

  – :z 會 label 這個目錄,使其可以被多個 container 共用 

  – :Z 會 label 這個目錄,使其可以被目前的 container 使用 (其他 container 不能共用)

加上 :z 或 :Z 後,docker 會幫我們 label 由這個目錄掛載起來的 volume,

因此 container 裡面就不會被 SELinux 阻擋存取 volume 的資料了~

 

舉例來說,我可以把一開始的 docker run 指令改成下面這樣:

docker run -it -v ~/p4:/p4:z testuser/build_prj /bin/bash

 

接著在 container 裡面,就能成功的存取 /p4 的檔案了:

root@fe90d2001d04 /p4 # ll
total 260
drwxrwxr-x.  9 1000 1000  4096 Sep 17 09:26 Common
-r--r--r--.  1 1000 1000 13415 Oct  1 16:40 Makefile

 

(本頁面已被瀏覽過 1,684 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料