
複数コンテナのDockerアプリケーションをデプロイすると、docker-compose
PHP-FPMを実行するalpineから構築されたコンテナがあります。そのコンテナは、NginxコンテナにPHPを提供するだけでなく、PHPスクリプトを実行するためにも使用されます。コンテナ上CLIコマンドからホスト上ホスト上の CLI コマンドから実行されたときに PHP によって作成されたファイルは、 FPM がユーザー(UID 1000) とグループ(GID 1000) を使用するように構成されている場合でも、(UID 0) によって所有され、グループ (GID 0)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 =
www-data
ユーザー(UID 1000)としてファイルを書き込むように PHP を構成するにはどうすればよいでしょうか?
答え1
docker compose ymlファイルで「user」を使用し、userid:groupidを指定できます。
user: "1000:1000"