Docker容器ubuntu 21从根到根(本地机器到容器)在文件保存方面存在权限问题



我刚刚开始使用Docker,因为有人建议我使用它来简化开发,但到目前为止,它只不过是一种痛苦。我已经按照docker为Ubuntu操作系统提供的文档安装了docker engine (v20.10.12)docker composer (v 2.2.3)。两者都按预期工作。

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

默认情况下,docker在容器中以root身份运行。它";桥接器";根用户到本地机器上的根用户,并使用root:root在Ubuntu文件系统上创建文件(我的工作空间位于~/workspace/laravel中(。然后,当在IDE中打开文件时(在本例中为vscode(,我会得到错误:

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

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

所有这些都可以通过每次使用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

此示例的我的Dockerfile

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,这是在内核代码中编写的。无法自动更改非根文件的所有权。在这种情况下,在开发时,可以使用以下方法:

如果不需要超级用户权限:您可以动态创建用户,然后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"

最新更新