Docker container ubuntu 21 root to root (local machine to container) 文件保存权限问题

Docker container ubuntu 21 root to root (local machine to container) gives permission issues on file saves

我刚开始使用 Docker,因为有人向我推荐它可以使开发变得容易,但到目前为止,它只是痛苦。我已经根据 docker 为 Ubuntu OS 提供的文档安装了 docker engine (v20.10.12)docker composer (v 2.2.3)。两者都按预期工作。

每当我使用 docker compose 新建一个新容器时,无论来源如何,我都会对 docker 容器生成的文件(例如 laravel 应用程序)产生写入权限问题我在其中使用 php artisan 创建了一个控制器文件)。到目前为止,我已将问题确定如下:

默认情况下 docker 在容器中以 root 身份运行。它将 root 用户“桥接”到本地计算机上的 root 用户,并使用 root:root 在 Ubuntu 文件系统上创建文件(我的工作区位于 ~/workspace/laravel 中)。然后在 IDE(在本例中为 vscode)中打开文件时出现错误:

Failed to save to '<file_name>': insufficient permissions. Select 'Retry as Sudo' to retry as superuser

如果我尝试将我自己的本地用户解析到机器中并告诉它使用特定的用户 ID 和组 ID,那么当我使用机器上创建的第一个用户 (1000:1000) 时一切都很好,因为例如,如果我们查看 bitnami/laravel docker 图像,它将与容器默认用户匹配。

每次我使用php artisan创建文件时,所有这些都可以通过工作区目录上的运行 chown -R yadayada .来解决。但我不认为这在任何形式或形式上都是可持续的或明智的。

如何让我的 docker 容器在启动时检查我的 UIDGID 的用户是否存在,如果不存在,则创建一个具有该用户的用户id 并指定为系统用户?

我的 docker-compose.yml 这个例子

version: '3.8'

services:
  api_php-database:
    image: postgres
    container_name: api_php-database
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: laravel_docker
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    ports:
      - '5432:5432'
  api_php-apache:
    container_name: api_php-apache
    build:
      context: ./php
    ports:
      - '8080:80'
    volumes:
      - ./src:/var/www/laravel_docker
      - ./apache/default.conf:/etc/apache2/sites-enabled/000-default.conf
    depends_on:
      - api_php-database

我的 Docker这个例子的文件

FROM php:8.0-apache

RUN apt update && apt install -y g++ libicu-dev libpq-dev libzip-dev zip zlib1g-dev && docker-php-ext-install intl opcache pdo pdo_pgsql pgsql

WORKDIR /var/www/laravel_docker

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

一般来说,这是不可能的,但有解决方法(我不建议将它们用于生产)。 超级用户的UID永远是0,这个是写在内核代码里的。 无法自动更改 non-root 文件的所有权。 这种情况,在开发的时候,可以使用这些方法:

如果不需要超级用户权限: 可以动态创建用户,然后docker-compose.yml:

version: "3.0"
services:
  something:
    image: example-image
    volumes:
      - /user/path1:/container/path1
      - /user/path2:/container/path2
    # The double $ is needed to indicate that the variable is in the container
    command: ["bash", "-c", "chown -R $$HOST_UID:$$HOST_GID /container/path1 /container/path2; useradd -g $$HOST_GID -u $$HOST_UID user; su -s /bin/bash user"]
    environment:
      HOST_GID: 100
      HOST_UID: 1000

否则,如果您 运行 在 Bash 中以 root 身份在容器中命令: Bash 将在每个命令执行后 运行 来自 PROMPT_COMMAND 变量的脚本 这可以通过更改 docker-compose.yaml:

在开发中使用
version: "3.0"
services:
  something:
    image: example-image
    volumes:
      - /user/path1:/container/path1
      - /user/path2:/container/path2
    command: ["bash"]
    environment:
      HOST_UID: 1000
      HOST_GID: 100
      # The double $ is needed to indicate that the variable is in the container
      PROMPT_COMMAND: "chown $$HOST_UID:$$HOST_GID -R /container/path1 /container/path2"