繁体   English   中英

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

[英]Docker-compose set user and group on mounted volume

我正在尝试将 docker-compose 中的卷安装到 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

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

坏消息是volume 😢 没有所有者/组/权限设置。 好消息是以下技巧将让您将其烘焙到您的配置中,因此它是完全自动化的 🎉。

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

这样,当 docker-compose 挂载到该位置时,该目录将已经存在。 当服务器在启动过程中挂载时(基于 docker-compose),挂载操作很高兴地将这些权限置之不理。

Dockerfile:

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

docker-compose.yml

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

来源

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

  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

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

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

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

首先确定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。

将 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM