PHP-FPM создает файлы как root при настройке как www-data

PHP-FPM создает файлы как root при настройке как www-data

В многоконтейнерном приложении Docker, развернутом с помощью docker-composeу меня есть контейнер, созданный из Alpine, на котором запущен PHP-FPM. Этот контейнер используется как для предоставления PHP контейнеру Nginx, так и для запуска PHP-скриптовна контейнереиз CLI-командына хостеФайлы, созданные PHP при запуске из команд CLI на хосте, принадлежат root(UID 0) и имеют rootгруппу (GID 0), даже если FPM настроен на использование пользователя www-data(UID 1000) и группы www-data(GID 1000).

Вот соответствующие части Dockerfile:

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

Вот конфигурация:

$ 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

А вот и демонстрация прекрасной проблемы:

$ 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

Я также пробовал добавлять к команде run префикс , env UID=1000 GID=1000как предлагалось на некоторых форумах, однако это не дало никакого эффекта. Думая, что, возможно, интерпретатор CLI ( /usr/local/bin/php) не использует FPM за кулисами, я попытался проверить конфигурацию PHP, которая может быть релевантной, но не нашел ничего:

$ 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 =

Как настроить PHP для записи файлов от имени пользователя www-data, т.е. UID 1000?

решение1

Вы можете использовать «user» в yml-файле docker compose и указать userid:groupid

user: "1000:1000"

Связанный контент