
In einer Docker-Anwendung mit mehreren Containern, die ich bereitgestellt habe, docker-compose
habe ich einen Container aus Alpine erstellt, auf dem PHP-FPM läuft. Dieser Container wird sowohl zum Bereitstellen von PHP für den Nginx-Container als auch zum Ausführen von PHP-Skripten verwendet.auf dem Behältervon einem CLI-Befehlauf dem Host. Von PHP erstellte Dateien, wenn sie über CLI-Befehle auf dem Host ausgeführt werden, sind Eigentum von root
(UID 0) und haben die Gruppe (GID 0), auch wenn FPM für die Verwendung des Benutzers (UID 1000) und der Gruppe (GID 1000) root
konfiguriert ist .www-data
www-data
Hier sind die relevanten Teile des Dockerfiles:
FROM php:7.4-fpm-alpine
RUN echo http://dl-2.alpinelinux.org/alpine/edge/community/ >> /etc/apk/repositories
RUN apk --no-cache add shadow && usermod -u 1000 www-data && groupmod -g 1000 www-data
RUN chown -R www-data:www-data /var/www/html
Hier ist die Konfiguration:
$ docker-compose exec php grep -E "user|group" /usr/local/etc/php-fpm.d/www.conf
user = www-data
group = www-data
$ docker-compose exec php grep www-data /etc/passwd
www-data:x:1000:1000:Linux User,,,:/home/www-data:/sbin/nologin
Und hier ist eine Demonstration des feinen Problems:
$ docker-compose exec php ./artisan make:model Foo -m
Model created successfully.
Created Migration: 2020_09_25_051836_create_foos_table
$ docker-compose exec php ls -ln /var/www/html/database/migrations/2020_09_25_051836_create_foos_table.php
-rw-r--r-- 1 0 0 571 Sep 25 05:18 /var/www/html/database/migrations/2020_09_25_051836_create_foos_table.php
Ich habe auch versucht, dem Run-Befehl das Präfix hinzuzufügen, env UID=1000 GID=1000
wie in einigen Foren vorgeschlagen, aber das hatte keinen Effekt. Da ich dachte, dass der CLI-Interpreter ( /usr/local/bin/php
) vielleicht FPM im Hintergrund nicht verwendet, habe ich nach einer PHP-Konfiguration gesucht, die relevant sein könnte, aber keine gefunden:
$ docker-compose exec php grep -rvE "^; " /etc/php7/ | grep "user\|group"
/etc/php7/php.ini:;user_ini.filename = ".user.ini"
/etc/php7/php.ini:;user_ini.filename =
/etc/php7/php.ini:;user_ini.cache_ttl = 300
/etc/php7/php.ini:;ignore_user_abort = On
/etc/php7/php.ini:;syslog.facility = user
/etc/php7/php.ini:user_dir =
/etc/php7/php.ini:;user_agent="PHP"
/etc/php7/php.ini:;odbc.default_user = Not yet implemented
/etc/php7/php.ini:;ibase.default_user =
/etc/php7/php.ini:mysqli.default_user =
Wie kann ich PHP so konfigurieren, dass es Dateien als Benutzer schreibt www-data
, also UID 1000?
Antwort1
Sie können "user" in der Docker-Compose-YML-Datei verwenden und die Benutzer-ID:Gruppen-ID angeben
user: "1000:1000"