Dockerfileリーディング PHP-FPM公式イメージ(3)

2019/10/14/

前回記事からの続きです。引き続きPHPの公式イメージを読み解いていきます。
Dockerイメージ8層目(171行目)から読み進めていきます。

Dockerイメージ 8層目

COPY docker-php-ext-* docker-php-entrypoint /usr/local/bin/

PHPのExtentionを操作するスクリプトとDockerエントリポイントを設定するスクリプト一式をDockerコンテナ内にコピーします。

Dockerイメージ 9層目

# sodium was built as a shared module (so that it can be replaced later if so desired), so let's enable it too (https://github.com/docker-library/php/issues/598)
RUN docker-php-ext-enable sodium

以前は、ビルド時に –with-sodium を指定しており、子イメージでsodiumをアップデートできない事象が発生したそうです。–with-sodium=sharedとして、共有ライブラリを利用し個別アップデートできるように対応しましたというのが本コメントのissueにある内容です。ここでは、sodiumを有効にしています。

Dockerイメージ 10層目

ENTRYPOINT ["docker-php-entrypoint"]

ENTRYPOINTにこのスクリプトを設定します。php-fpmを設定し、引数のバリデーションを実施しています。

Dockerイメージ 11層目

##<autogenerated>##
WORKDIR /var/www/html

カレントディレクトリを/var/www/htmlに設定します。

Dockerイメージ 12層目(1/2)

RUN set -eux; \
	cd /usr/local/etc; \
	if [ -d php-fpm.d ]; then \
		# for some reason, upstream's php-fpm.conf.default has "include=NONE/etc/php-fpm.d/*.conf"
		sed 's!=NONE/!=!g' php-fpm.conf.default | tee php-fpm.conf > /dev/null; \
		cp php-fpm.d/www.conf.default php-fpm.d/www.conf; \
	else \
		# PHP 5.x doesn't use "include=" by default, so we'll create our own simple config that mimics PHP 7+ for consistency
		mkdir php-fpm.d; \
		cp php-fpm.conf.default php-fpm.d/www.conf; \
		{ \
			echo '[global]'; \
			echo 'include=etc/php-fpm.d/*.conf'; \
		} | tee php-fpm.conf; \
	fi; \

PHP7以降で、/usr/local/etc/php-fpm.dが存在する場合には、php-fpm.confの設定ファイルを編集し、/etc/php-fpm.d/*.confの設定ファイルをincludeするように設定します。php-fpm.dディレクトリがない場合は一貫性を持たせるためにディレクトリを作成し、同様の設定を行います。

Dockerイメージ 12層目(2/2)

	{ \
		echo '[global]'; \
		echo 'error_log = /proc/self/fd/2'; \
		echo; \
		echo '[www]'; \
		echo '; if we send this to /proc/self/fd/1, it never appears'; \
		echo 'access.log = /proc/self/fd/2'; \
		echo; \
		echo 'clear_env = no'; \
		echo; \
		echo '; Ensure worker stdout and stderr are sent to the main error log.'; \
		echo 'catch_workers_output = yes'; \
	} | tee php-fpm.d/docker.conf; \
	{ \
		echo '[global]'; \
		echo 'daemonize = no'; \
		echo; \
		echo '[www]'; \
		echo 'listen = 9000'; \
	} | tee php-fpm.d/zz-docker.conf

docker用の設定を実施します。ログ出力を標準出力/標準エラー出力とし、環境変数をパラメータとして渡すことを無効化、デーモン化も無効化したのち、9000番でリッスンするように設定します。

php-fpmの設定値についてのマニュアルはこちらにあります。

Dockerイメージ 13層目

# Override stop signal to stop process gracefully
# https://github.com/php/php-src/blob/17baa87faddc2550def3ae7314236826bc1b1398/sapi/fpm/php-fpm.8.in#L163
STOPSIGNAL SIGQUIT

Dockerでは、コンテナ終了時に基本的にSGTERMが送信されるため、gracefullyストップさせるためにSTOPSIGNALにSIGQUITを設定する。

Dockerイメージ 14層目

EXPOSE 9000
CMD ["php-fpm"]

9000番でリッスンし、php-fpmを実行します。

まとめ

dockerhubのPHP公式イメージである 7.2-fpm-alpineを読み解いてきました。
中身を確認するとわかるように、本Dockerイメージは再利用されやすいように設定されています。
ディレクトリ構成もデフォルト位置を利用おり、起動ユーザもwww-dataと固定されているため、既に細かな設定やデフォルト値から変更している環境については注意が必要でしょう。
細かなチューニングを行っている環境でなければそのまま利用することも可能なのではないでしょうか。