動かざることバグの如し

近づきたいよ 君の理想に

Dockerのphp-fpmをrootで実行させる方法

環境

概要

訳合って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の正体

公式phpが用意してるdocker用のphp-fpm設定

$ 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 に記載されているので、それ以降でないといけない