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

新手上路,请多包涵

我正在尝试将 docker-compose 中的卷挂载到 apache 映像。问题是,我的 docker 中的 apache 在 www-data:www-data 下运行,但安装目录是在 root:root 下创建的。如何指定挂载目录的用户?

我试图运行命令 setupApacheRights.shchown -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

我希望能够指定将在其下安装它的用户。有办法吗?

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

阅读 2.6k
2 个回答

首先确定 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 打印到标准输出。

编辑:修复 CLI 标志的大小写错误。谢谢@jcalfee314!

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

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

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

  1. 将定义添加到您的 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

  1. .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 用户),因此请确保它已经存在并且由您要使用的用户 ID/组ID 拥有。

我为 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"

只有对主机目录 /home/manuel/docker/dokuwiki/data 具有写入权限,dokuwiki 容器才能正确初始化。

如果在启动时该目录不存在,docker 将为我们创建它,但它将 root:root 作为用户和组。 –> 因此容器启动会失败。

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

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

然后检查

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

文件夹具有哪个 uid 和 gid - 并检查它们是否与我们在上面的步骤 3 中放入 .env 文件中的那些相匹配。

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

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