写在共享卷docker中

时间:2015-03-25 00:05:47

标签: 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

2 个答案:

答案 0 :(得分:48)

Docker中的

(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;

运行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

成功!

答案 1 :(得分:26)

将以下行添加到dockerfile并重建图像

RUN usermod -u 1000 www-data
RUN usermod -G staff www-data