在部署的多容器 Docker 应用程序中,docker-compose
我有一个从运行 PHP-FPM 的 alpine 构建的容器。该容器既用于向 Nginx 容器提供 PHP,又用于运行 PHP 脚本在容器上从 CLI 命令在主机上。即使 FPM 配置为使用用户(UID 1000) 和组(GID 1000),从主机上的 CLI 命令运行时由 PHP 创建的文件归root
(UID 0) 所有,并且具有组 (GID 0) 。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)写入文件?
答案1
您可以在 docker compose yml 文件中使用“user”并指定 userid:groupid
user: "1000:1000"