Permissions
PHP-FPM 在配置為 www-data 時以 root 身份創建文件
在部署的多容器 Docker 應用程序中,
docker-compose
我有一個由執行 PHP-FPM 的 alpine 建構的容器。該容器既用於向 Nginx 容器提供 PHP,也用於通過主機上的 CLI 命令在容器上執行 PHP 腳本。從主機上的 CLI 命令執行時由 PHP 創建的文件歸(UID 0) 所有,並具有組 (GID 0),即使 FPM 配置為使用使用者(UID 1000) 和組(GID 1000)。root``root``www-data``www-data
以下是 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?
您可以在 docker compose yml 文件中使用“user”並指定 userid:groupid
user: "1000:1000"