Docker-在安装的卷上组合设置用户和组

我正试着在 docker 中装入一个卷-构图到 apache 图像。问题是,我的 docker 中的 apache 在 www-data:www-data下运行,但是挂载的目录是在 root:root下创建的。如何指定挂载目录的用户?

我尝试运行命令 setupApacheRights.sh.chown -R www-data:www-data /var/www,但它显示的是 chown: changing ownership of '/var/www/somefile': Permission denied

services:
httpd:
image: apache-image
ports:
- "80:80"
volumes:
- "./:/var/www/app"
links:
- redis
command: /setupApacheRights.sh

我希望能够指定用户下,它将被挂载。有办法吗?

212378 次浏览

首先确定 www-data用户的 uid:

$ docker exec DOCKER_CONTAINER_ID id
uid=100(www-data) gid=101(www-data) groups=101(www-data)

然后,在 docker 主机上,使用 uid (本例中为100)更改挂载目录的所有者:

chown -R 100 ./

动态扩展

如果你正在使用 docker-compose,你也可以这样做:

$ docker-compose exec SERVICE_NAME id
uid=100(www-data) gid=101(www-data) groups=101(www-data)
$ chown -R 100 ./

你可以把这句话写成一句俏皮话:

$ chown -R $(docker-compose exec SERVICE_NAME id -u) ./

-u标志只会将 uid打印到 stdout。

编辑: 固定的大小写错误的 CLI 标志。谢谢@jcalfe314!

要在不更改主机系统上的所有者/权限的情况下实现所需的行为,请执行以下步骤。

  1. 获取所需用户和组的 ID,您希望在主机系统上执行 id命令的权限匹配-这将显示当前用户的 uid 和 gid,以及该用户所在组的所有 ID。

     $ id
    
  2. 将定义添加到 docker-compose. yml

     user: "${UID}:${GID}"
    

    让你的档案看起来像这样

     php: # this is my service name
    user: "${UID}:${GID}" # we added this line to get a specific user / group id
    image: php:7.3-fpm-alpine # this is my image
    # and so on
    
  3. 设置 .env文件中的值

     UID=1000
    GID=1001
    

3a. 或者,你可以用以下方法扩展你的 ~/.bashrc文件:

    export UID GID

全局定义它,而不是在每个项目的.env 文件中定义它。 如果这对您不起作用(就像在我当前的发行版中一样,GID 不是由此设置的,请使用以下两行:

    export UID=$(id -u)
export GID=$(id -g)

感谢@SteenSch ütt 提供了在全球范围内定义 UID/GID 的简单解决方案。

现在容器中的用户的 id 是1000,组是1001,您可以对每个环境进行不同的设置。

注意: 请用您在主机系统上找到的用户/组 ID 替换我使用的 ID。由于我不能知道您的系统正在使用哪些 ID,所以我给出了一些示例组和用户 ID。

如果你不使用 docker-compose 或者想知道更多不同的方法来实现这一点,请阅读我的信息来源: https://dev.to/acro5piano/specifying-user-and-group-in-docker-i2e

如果卷装入文件夹在您的计算机上不存在,docker 将创建它(使用 root 用户) ,所以请确保它已经存在并且由您想要使用的 userid/groupid 所拥有。

我添加了一个 dokuwiki 容器的示例来更好地解释它:

version: '3.5'
services:
dokuwiki:
user: "${UID}" # set a specific user id so the container can write in the data dir
image: bitnami/dokuwiki:latest
ports:
- '8080:8080'
volumes:
- '/home/manuel/docker/dokuwiki/data:/bitnami/dokuwiki/'
restart: unless-stopped
expose:
- "8080"

Dokuwiki 容器只有在对主机目录 /home/manuel/docker/dokuwiki/data具有写访问权时才能正确初始化。

如果在启动时这个目录不存在,docker 将为我们创建它,但它将有 root: root 作为 user & group。因此容器启动将会失败。

如果我们在启动容器之前创建文件夹

mkdir -P /home/manuel/docker/dokuwiki/data

然后再问问

ls -nla /home/manuel/docker/dokuwiki/data| grep ' \.$'

哪个 uid 和 gid 文件夹有-并检查它们是否与我们放在。步骤3中的 env 文件。以上。

坏消息是 volume没有所有者/组/权限设置。好消息是下面的技巧可以让你把它放到你的配置中,所以它是完全自动化的。

在 Dockerfile 中,使用所需的设置在正确的位置创建一个空目录。

这样,当 docker-compose 挂载到位置时,目录就已经存在了。当服务器在引导期间挂载(基于 docker-compose)时,挂载操作很高兴地将这些权限单独留下。

文件夹:

# setup folder before switching to user
RUN mkdir /volume_data
RUN chown postgres:postgres /volume_data
USER postgres

码头作曲

volumes:
- /home/me/postgres_data:/volume_data

来源

将 rw 添加到卷安装的末尾对我来说很有效:

services:
httpd:
image: apache-image
ports:
- "80:80"
volumes:
- "./:/var/www/app:rw"
links:
- redis
command: /setupApacheRights.sh

为这个撰写服务设置用户 www-data

    user: "www-data:www-data"

例如:

 wordpress:
depends_on:
- db
image: wordpress:5.5.3-fpm-alpine
user: "www-data:www-data"
container_name: wordpress
restart: unless-stopped
env_file:
- .env
volumes:
- ./wordpress/wp-content:/var/www/html/wp-content
- ./wordpress/wp-config-local.php:/var/www/html/wp-config.php