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

sim*_*Pod 27 docker docker-compose

我正在尝试将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
Run Code Online (Sandbox Code Playgroud)

我希望能够指定安装它的用户.有办法吗?

Arn*_* L. 18

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

$ docker exec DOCKER_CONTAINER_ID id
uid=100(www-data) gid=101(www-data) groups=101(www-data)
Run Code Online (Sandbox Code Playgroud)

然后,在本地计算机上,使用uid更改已安装目录的所有者(在此示例中为100):

chown -R 100 ./
Run Code Online (Sandbox Code Playgroud)

动态扩展

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

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

你可以把它放在一个单行中:

$ chown -r $(docker-compose exec SERVICE_NAME id -u) ./
Run Code Online (Sandbox Code Playgroud)

-u标志只会打印uid到标准输出.

  • 谢谢你的回答。但这不是很动态。我想说,设置它的主要目标应该是不需要进一步定制的东西。但是没有其他方法可以解决它,或者至少我找不到它。我将尝试构建apache,以便它可以在root用户下运行,这也许也可以。 (4认同)
  • @阿内尔。我太严厉了,但问题是现实的。docker-compose 文件背后的想法是多个开发人员可以获得一些代码,并且只要安装了 docker,“它就可以工作”。当您使用特定于主机的内容(在本例中为主机用户 ID)时,这种情况就会崩溃。给出的建议可能在 Linux 上有效,但下一个人在 Windows 或 Mac 上可能就不那么幸运了。绑定挂载有其用途,但对于这个特定问题,我认为人们会更少地使用[标准 docker 卷](https://docs.docker.com/storage/volumes/)。 (4认同)

小智 8

将 rw 添加到卷挂载的末尾对我有用:

services:
    httpd:
        image: apache-image
        ports:
            - "80:80"
        volumes:
            - "./:/var/www/app:rw"
        links:
            - redis
        command: /setupApacheRights.sh
Run Code Online (Sandbox Code Playgroud)

  • 您是否在非 root 用户下运行该服务? (8认同)

mah*_*off 7

volume截至2019年中期,似乎没有所有者/组/权限设置,但是有一个不错的解决方法,那就是在docker-compose中使用所需设置创建目录。当docker-compose挂载到该位置时,它将保留这些权限。

Dockerfile:

# setup folder before switching to user
RUN mkdir /volume_data
RUN chown postgres:postgres /volume_data
USER postgres
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

volumes:
   - /home/me/postgres_data:/volume_data
Run Code Online (Sandbox Code Playgroud)

资源

  • 不起作用,挂载点上的 uid/gid 被主机权限覆盖 (18认同)
  • 错误:`chown:/volume_data:没有这样的文件或目录。`。这对我不起作用。我认为这是因为 docker-file 在 `chown` 之前声明了卷。回复:/sf/ask/1830174601/ (2认同)
  • 对我来说效果很好 (2认同)

Man*_*art 6

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

  1. 将定义添加到您的docker-compose.yml

    user: "${UID}:${GID}"
    
    Run Code Online (Sandbox Code Playgroud)

    所以你的文件可能看起来像这样

    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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 设置.env文件中的值

    UID=1000
    GID=1001
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  • 就我而言,容器不会发现它的名称,因为 www-data 用户的 gid 和 uid 为 33。这给我带来了其他问题。 (3认同)

小智 5

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

    user: "www-data:www-data"
Run Code Online (Sandbox Code Playgroud)

例子:

 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
Run Code Online (Sandbox Code Playgroud)