我有一个带有php应用程序的docker
我有一个分享量,例如
/home/me/dev/site <=> /var/www/site
我可以在我的主机上写东西,它会与容器同步
如果我发布
sudo docker exec test touch /var/www/site/test.txt
它有效
但是如果我的服务器试图创建一个文件为www-data
,那么由于权利而无法正常工作。
有没有办法让我的共享卷可以访问www-data
?
我正在使用boot2docker
答案 0 :(得分:48)
(Bind-mounted)卷将保留设置的权限 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
;
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
成功!
答案 1 :(得分:26)
将以下行添加到dockerfile并重建图像
RUN usermod -u 1000 www-data
RUN usermod -G staff www-data