Dockerfileリーディング WordPress公式イメージ

2019/10/14/

本番運用を想定して、Docker上にWordpressを構築するために公式イメージでどういった設定がされているのか読み解く必要がありました。(ブラックボックスのものをそのまま使うわけにはいかない)
前回記事では、Wordpressのベースイメージとなっている PHP-FPMの公式Dockerfileの内容を確認しました。 今回は5.2.2-php7.2-fpm-alpineを読んでいきます。

Dockerfile 1層目

FROM php:7.2-fpm-alpine

ベースイメージとして、php:7.2-fpm-alpineが利用されています。詳細な設定内容については前回記事を参照してください。

Dockerfile 2層目

# docker-entrypoint.sh dependencies
RUN apk add --no-cache \
# in theory, docker-entrypoint.sh is POSIX-compliant, but priority is a working, consistent image
		bash \
# BusyBox sed is not sufficient for some of our sed expressions
		sed

docker-entrypoint.shに依存するパッケージの導入を行います。

Dockerfile 3層目

Dockerfile 3層目(1/8)

# install the PHP extensions we need (https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions)
RUN set -ex; \
	\
	apk add --no-cache --virtual .build-deps \
		$PHPIZE_DEPS \
		imagemagick-dev \
		libjpeg-turbo-dev \
		libpng-dev \
	; \
	\

WordPressのインストール要件に記載されているPHP-Extentionで必要なパッケージを導入します。
ここでは、ビルド時に依存するパッケージのみ指定して導入しています。

Dockerfile 3層目(2/8)

	docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr; \

ベースイメージで配置したPHPのExtentionを構成するスクリプトを実行します。ここでは、gdの設定を実施しています。

Dockerfile 3層目(3/8)

	docker-php-ext-install \
		bcmath \
		exif \
		gd \
		mysqli \
		opcache \
		zip \
	; \

ベースイメージで配置したPHPのExtentionを導入するスクリプトを実行します。Wordpressに必要な拡張パッケージを導入していきます。

Dockerfile 3層目(4/8)

	pecl install imagick-3.4.4; \

imagickを導入します。

Dockerfile 3層目(5/8)

	docker-php-ext-enable imagick; \

ベースイメージで配置したスクリプトでimagickを有効にします。

Dockerfile 3層目(6/8)

	runDeps="$( \
		scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \
			| tr ',' '\n' \
			| sort -u \
			| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
	)"; \

PHPの拡張パッケージのなかから、共有ライブラリを利用するパッケージを探し、runDepsに設定します。

Dockerfile 3層目(7/8)

	apk add --virtual .wordpress-phpexts-rundeps $runDeps; \

さきほどのrunDepsに設定されているパッケージを導入します。

Dockerfile 3層目(8/8)

	apk del .build-deps

ビルド時に必要だったパッケージを削除します。

Dockerfile 4層目

# set recommended PHP.ini settings
# see https://secure.php.net/manual/en/opcache.installation.php
RUN { \
		echo 'opcache.memory_consumption=128'; \
		echo 'opcache.interned_strings_buffer=8'; \
		echo 'opcache.max_accelerated_files=4000'; \
		echo 'opcache.revalidate_freq=2'; \
		echo 'opcache.fast_shutdown=1'; \
	} > /usr/local/etc/php/conf.d/opcache-recommended.ini

opcacheの推奨設定を実施します。

Dockerfile 5層目

# https://codex.wordpress.org/Editing_wp-config.php#Configure_Error_Logging
RUN { \
		echo 'error_reporting = 4339'; \
		echo 'display_errors = Off'; \
		echo 'display_startup_errors = Off'; \
		echo 'log_errors = On'; \
		echo 'error_log = /dev/stderr'; \
		echo 'log_errors_max_len = 1024'; \
		echo 'ignore_repeated_errors = On'; \
		echo 'ignore_repeated_source = Off'; \
		echo 'html_errors = Off'; \
	} > /usr/local/etc/php/conf.d/error-logging.ini

コメントに記載されているページはこちらに移動しているようです。エラーロギングの設定が記載されています。

Dockerfile 6層目

VOLUME /var/www/html

/var/www/htmlを外部からマウント可能にします。

Dockerfile 7層目

ENV WORDPRESS_VERSION 5.2.2
ENV WORDPRESS_SHA1 3605bcbe9ea48d714efa59b0eb2d251657e7d5b0

RUN set -ex; \
	curl -o wordpress.tar.gz -fSL "https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz"; \
	echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c -; \
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
	tar -xzf wordpress.tar.gz -C /usr/src/; \
	rm wordpress.tar.gz; \
	chown -R www-data:www-data /usr/src/wordpress

WORDPRESSバージョンとWORDPRESSのソースファイルのハッシュ値を変数に格納します。
WORDPRESSのソースファイルをダウンロードし、ハッシュ値の比較後、/usr/srcディレクトリに展開します。
WORDPRESSのtarballを削除し、展開したwordpressのディレクトリ権限を設定します。

Dockerfile 8層目

COPY docker-entrypoint.sh /usr/local/bin/

エントリポイント設定用のスクリプトを/usr/local/binに配置します。

Dockerfile 9-10層目

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["php-fpm"]

エントリポイントを設定し、php-fpmを起動します。

まとめ

一通りWordpressを構成するDockerfileを確認してきました。
特別な設定はしておらず、汎用的に使えてかつWordpressの推奨設定を順を追って実施していく内容です。
ただし、ディレクトリや起動ユーザなどが決まっていることと、一部Apache用の設定やスクリプトが導入されているため、Nginxなどを利用する場合にはスリム化も可能でしょう。
本番環境で利用するために細かい設定を実施する場合には、本イメージを参考に環境に合わせて設定することが良いのではないでしょうか。このイメージのままでもphp.iniの設定をしっかり行えば本番でも利用はできそうです。