PHP-FPM erstellt Dateien als Root, wenn es als www-data konfiguriert ist

PHP-FPM erstellt Dateien als Root, wenn es als www-data konfiguriert ist

In einer Docker-Anwendung mit mehreren Containern, die ich bereitgestellt habe, docker-composehabe 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) rootkonfiguriert ist .www-datawww-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=1000wie 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"

verwandte Informationen