環境
- php 7.4
概要
訳合ってdockerで動かすphp-fpmのコンテナ内のphp-fpmをrootで実行したいということになった。
が、セキュリティ上の理由かデフォルトではrootではなくwww-dataというユーザーで動作している
root@43910975d907:~# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.4 1.0 80244 21516 ? Ss 19:32 0:00 php-fpm: master process (/usr/local/etc/php-fpm.conf) www-data 7 0.0 0.3 80244 6260 ? S 19:32 0:00 php-fpm: pool www www-data 8 0.0 0.3 80244 6196 ? S 19:32 0:00 php-fpm: pool www root 9 0.2 0.1 3864 3152 pts/0 Ss 19:32 0:00 bash root 17 0.0 0.1 7636 2712 pts/0 R+ 19:33 0:00 ps aux
これをrootにしたい
dockerイメージのカスタマイズ
今回は公式のdockerイメージを使用する。
適当にDockerfileを作成して
FROM php:7.4-fpm RUN apt-get update && apt-get install -y procps COPY zz-docker.conf /usr/local/etc/php-fpm.d/zz-docker.conf CMD ["php-fpm", "--allow-to-run-as-root"]
と記述。procps入れているのはpsコマンドで動作の確認用なので本来は不要
次にDockerfileと同じパスに zz-docker.conf を作成して以下
[global] daemonize = no [www] listen = 9000 listen.owner = root listen.group = root user = root group = root
docker build -t myphp .
とかでビルド
あとは実行して
docker run --name myphp --rm myphp
別タブでコンテナの中に入る
docker exec -it myphp bash
するとrootになっていることがわかる。やったね
root@a27bef21ef43:~# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.9 1.0 80244 21700 ? Ss 19:35 0:00 php-fpm: master process (/usr/local/etc/php-fpm.conf) root 7 0.0 0.3 80244 6388 ? S 19:35 0:00 php-fpm: pool www root 8 0.0 0.3 80244 6388 ? S 19:35 0:00 php-fpm: pool www root 9 0.6 0.1 3864 3100 pts/0 Ss 19:35 0:00 bash root 14 0.0 0.1 7636 2712 pts/0 R+ 19:35 0:00 ps aux
--allow-to-run-as-rootが必要な理由
ENTRYPOINTで --allow-to-run-as-root
を追加しているが、これがないと
$ docker docker run --name myphp --rm myphp [14-Nov-2020 19:45:41] ERROR: [pool www] please specify user and group other than root [14-Nov-2020 19:45:41] ERROR: [pool www] please specify user and group other than root [14-Nov-2020 19:45:41] ERROR: FPM initialization failed [14-Nov-2020 19:45:41] ERROR: FPM initialization failed
となってしまい起動すらできない。
zz-docker.confの正体
$ docker docker run --rm php:7.4-fpm ls -l /usr/local/etc/php-fpm.d/ total 48 -rw-r--r-- 1 root root 357 Nov 5 20:25 docker.conf -rw-r--r-- 1 root root 19683 Nov 5 20:25 www.conf -rw-r--r-- 1 root root 19683 Nov 5 20:25 www.conf.default -rw-r--r-- 1 root root 45 Nov 5 20:25 zz-docker.conf
$ docker docker run --rm php:7.4-fpm cat /usr/local/etc/php-fpm.d/zz-docker.conf [global] daemonize = no [www] listen = 9000
ファイル名がアルファベットの若い順に読み込まれるので、zz-docker.confはまあ最後にロードされる、つまり一番優先度が高いよね、って話。
実際user名www-dataの設定は /usr/local/etc/php-fpm.d/www.conf に記載されているので、それ以降でないといけない