写入共享卷 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

原文由 Ajouve 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 368
1 个回答

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

成功!

原文由 thaJeztah 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题