[英]write in shared volumes docker
我有一個帶有php應用程序的docker
例如,我有一個分享量
/home/me/dev/site <=> /var/www/site
我可以在我的主機上寫一些東西,它會與容器同步
如果我發射
sudo docker exec test touch /var/www/site/test.txt
有用
但是,如果我的服務器嘗試將文件創建為www-data
則由於權限而無法正常工作。
有沒有辦法讓我的共享卷訪問www-data
?
我正在使用boot2docker
Docker中的(綁定安裝的)卷將保留在Docker主機上設置的權限。 您可以使用它來設置這些文件和目錄的權限,然后在容器中使用它們。
一些背景 ;
Linux中的權限基於用戶和組ID ( 'uid'
/ 'gid'
)。 即使你看到一個用戶和組名作為所有者,這些名字是不是在Linux的真正重要的是,他們只是在那里讓你更容易,看看誰是一個文件的所有者(它們從抬頭/etc/passwd
文件)。
您可以在文件上設置任何 uid
/ gid
; 設置這些權限時,用戶不必存在 。 例如;
touch foobar && sudo chown 1234:5678 foobar && ls -la foobar
# UID and GID are set to 1234 / 5678, even though there's no such user
-rw-rw-r-- 1 1234 5678 0 Mar 25 19:14 foobar
如上所述,Docker在使用卷時維護主機的所有權。 此示例顯示卷中的權限和所有權在容器外部和內部是相同的;
# (First create a dummy site)
mkdir -p volume-example/site && cd volume-example
echo "<html><body>hello world</body></html>" > site/index.html
# Permissions on the Docker host;
ls -n site
# total 4
# -rw-rw-r-- 1 1002 1002 38 Mar 25 19:15 index.html
# And, permissions inside a nginx container, using it as volume;
sudo docker run --rm -v $(pwd)/site:/var/www nginx ls -n /var/www
# total 4
# -rw-rw-r-- 1 1002 1002 38 Mar 25 19:15 index.html
如上所述,用戶不必存在才能使用它們,所以即使我們在Docker主機上沒有www-data
用戶,如果我們知道“uid”,我們仍然可以設置正確的權限。該用戶在容器內的“gid”;
讓我們看看www-data用戶的uid和gid在容器內是什么;
sudo docker run --rm nginx id www-data
# uid=33(www-data) gid=33(www-data) groups=33(www-data)
首先在更改權限之前檢查狀態。 這次我們以用戶www-data
運行nginx容器;
sudo docker run \
--rm \
--volume $(pwd)/site:/var/www \
--user www-data nginx touch /var/www/can-i-write.txt
# touch: cannot touch `/var/www/can-i-write.txt': Permission denied
接下來,在本地目錄上設置權限,看看我們是否能夠寫入;
sudo chown -R 33:33 site
sudo docker run \
--rm \
--volume $(pwd)/site:/var/www \
--user www-data nginx touch /var/www/can-i-write.txt
成功!
將以下行添加到dockerfile並重建映像
RUN usermod -u 1000 www-data
RUN usermod -G staff www-data
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.