PHP-FPM 設定為 www-data 時以 root 身分建立文件

PHP-FPM 設定為 www-data 時以 root 身分建立文件

在部署的多容器 Docker 應用程式中,docker-compose我有一個從運行 PHP-FPM 的 alpine 建置的容器。此容器既用於向 Nginx 容器提供 PHP,也用於執行 PHP 腳本在容器上從 CLI 命令在主機上。從主機上的 CLI 指令執行時由 PHP 建立的檔案歸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

我還嘗試按照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

您可以在 docker compose yml 檔案中使用“user”並指定 userid:groupid

user: "1000:1000"

相關內容