[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
(本頁面已被瀏覽過 4,362 次)