サイトアイコン

toLog

WordPressを使いやすくするためDockerfileをカスタマイズ

  • 更新日:
  • 投稿日:
サムネイル

この記事は最終更新日から4年以上が経過しています。

はじめに

個人的な印象になるのですが、WordPress はローカル・開発・検証・本番などの各環境ごとに設定が微妙に異なっていくケースが多く見受けられます。

というのも、WordPress では管理画面からシステム全体に影響を及ぼす設定を比較的簡単に変えられてしまうためです。裏を返せばこのおかげで初心者の方にも扱いやすいのかもしれません。

ですが、環境ごとに差異があると、仕様変更や機能追加時に思わぬ挙動をする可能性があるのも事実です。そこで、ミドルウェアとアプリケーションをコード管理できる Docker に白羽の矢が立ちます。

ミドルウェアの構築や WordPress のシステム設定をコード化することで、各環境でコンテナをビルドするだけでほぼ同一の環境が作れます。「ほぼ」なのは、接続先のデータベースにも設定情報が格納されているためです。また、コード自体がインフラ設定のドキュメントにもなり一石二鳥です。

やりたいこと

しかし、Docker の公式で用意されている WordPress イメージは、ちょこちょこ使いづらいように感じます。そのため、今回は下記の観点で独自でカスタマイズした Dockerfile で WordPress 環境を構築しました。

  • 日本語版 WordPress をインストールするように変更
  • /wp-content/plugins を Dockerfile で管理できるように変更
  • 重要な設定が保存される wp-config.php を Dockerfile から追加
  • /wp-content のパーミッションを変更してメディアファイルが保存できるように変更

検証環境

  • macOS Catalina バージョン 10.15.3
  • docker desktop community Version 2.2.0.3

何はともあれ Dockerfile

だらだら説明するより今回作成した Dockerfile を見てもらえればです。Docker 公式の wordpress:php7.3-fpm-alpine イメージをベースに作成しています。

1FROM php:7.3-fpm-alpine
2
3# Environment values
4ARG WP_PATH
5ARG WP_VERSION
6ARG WP_LOCALE
7
8# Initial setup
9RUN set -ex; \
10# 1) Install initial modules
11    apk update; \
12    apk add --no-cache \
13            wget \
14            unzip \
15        bash \
16        sed \
17        ghostscript \
18      mysql; \
19# 2) Install php extension
20  apk add --no-cache --virtual .build-deps \
21    $PHPIZE_DEPS \
22    freetype-dev \
23    imagemagick-dev \
24    libjpeg-turbo-dev \
25    libpng-dev \
26    libzip-dev; \
27  docker-php-ext-configure gd --with-freetype-dir=/usr --with-jpeg-dir=/usr --with-png-dir=/usr; \
28  docker-php-ext-install -j "$(nproc)" \
29    bcmath \
30    exif \
31    gd \
32    mysqli \
33    opcache \
34    zip; \
35  pecl install imagick-3.4.4; \
36  docker-php-ext-enable imagick; \
37  runDeps="$( \
38    scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \
39      | tr ',' '\n' \
40      | sort -u \
41      | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
42  )"; \
43  apk add --virtual .wordpress-phpexts-rundeps $runDeps; \
44  apk del .build-deps; \
45# 3) Create custom php.ini
46# recommended opacache ini
47  { \
48    echo "opcache.memory_consumption=128"; \
49    echo "opcache.interned_strings_buffer=8"; \
50    echo "opcache.max_accelerated_files=4000"; \
51    echo "opcache.revalidate_freq=2"; \
52    echo "opcache.fast_shutdown=1"; \
53  } > /usr/local/etc/php/conf.d/opcache-recommended.ini; \
54# recommend log ini
55  { \
56    echo "error_reporting = E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_RECOVERABLE_ERROR"; \
57    echo "display_errors = Off"; \
58    echo "display_startup_errors = Off"; \
59    echo "log_errors = On"; \
60    echo "error_log = /dev/stderr"; \
61    echo "log_errors_max_len = 1024"; \
62    echo "ignore_repeated_errors = On"; \
63    echo "ignore_repeated_source = Off"; \
64    echo "html_errors = Off"; \
65  } > /usr/local/etc/php/conf.d/error-logging.ini;
66
67# Install Wordpress and plugins
68RUN set -ex; \
69# download wordpress
70    wget "https://${WP_LOCALE}.wordpress.org/wordpress-${WP_VERSION}-${WP_LOCALE}.tar.gz"; \
71    tar -xvzf "wordpress-${WP_VERSION}-${WP_LOCALE}.tar.gz" -C ${WP_PATH} --strip=1; \
72    rm "wordpress-${WP_VERSION}-${WP_LOCALE}.tar.gz"; \
73# download plugins
74    wget https://downloads.wordpress.org/plugin/wp-multibyte-patch.2.8.3.zip; \
75    unzip *.zip -d ${WP_PATH}/wp-content/plugins/; \
76    rm *.zip;
77
78# Copied wordpress config
79ADD wp-config.php ${WP_PATH}/wp-config.php
80
81# Change authority
82RUN set -ex; \
83  chmod -R 0707 \
84  ${WP_PATH}/wp-content;

ポイント

日本語版の WordPress をインストールするように変更

公式 Docker のイメージは英語版がデフォルトなので、今回は指定したロケール(国・地域)の WordPress をインストールできるようにしています。docker-compose.yml から Dockerfile に環境変数を受け取ってロケールを指定します。例えば、 WP_VERSION5.3.2WP_LOCALEja を指定すると wodpress-5.3.2-ja がインストールされるようになります。

Dockerfile

1FROM php:7.3-fpm-alpine
2
3# Environment values
4ARG WP_PATH
5ARG WP_VERSION
6ARG WP_LOCALE
7
8~~ 略 ~~
9
10# Install WordPress and plugins
11RUN set -ex; \
12# download WordPress
13    wget "https://${WP_LOCALE}.wordpress.org/wordpress-${WP_VERSION}-${WP_LOCALE}.tar.gz"; \
14    tar -xvzf "wordpress-${WP_VERSION}-${WP_LOCALE}.tar.gz" -C ${WP_PATH} --strip=1; \
15    rm "wordpress-${WP_VERSION}-${WP_LOCALE}.tar.gz";
16
17~~ 略 ~~

docker-compose.yml

1~~  ~~
2
3  wordpress:
4    build:
5      context: "."
6      args:
7        WP_PATH: /var/www/html
8        WP_VERSION: 5.3.2
9        WP_LOCALE: ja
10
11~~  ~~

プラグインを Dockerfile で管理できるように変更

/wp-content/plugins に wget で指定したプラグインのバージョンをダウンロードして zip 解凍しています。これによりコード上でプラグインを管理することができます。

1~~ 略 ~~
2
3RUN set -ex; \
4# download WordPress
5    wget "https://${WP_LOCALE}.wordpress.org/wordpress-${WP_VERSION}-${WP_LOCALE}.tar.gz"; \
6    tar -xvzf "wordpress-${WP_VERSION}-${WP_LOCALE}.tar.gz" -C ${WP_PATH} --strip=1; \
7    rm "wordpress-${WP_VERSION}-${WP_LOCALE}.tar.gz"; \
8# download plugins
9    wget https://downloads.wordpress.org/plugin/wp-multibyte-patch.2.8.3.zip; \
10    unzip *.zip -d ${WP_PATH}/wp-content/plugins/; \
11    rm *.zip;
12
13~~ 略 ~~

重要な設定が保存される wp-config.php を Dockerfile から追加

個人的にはここが一番苦労しました(汗)。

というのも公式で用意されているイメージはコンテナの build 時に Entrypoint のシェルスクリプトが wp-config.php を生成するようになっているため、 Dockerfile 側で Add や Copy したり、docker-compose.yml で volumes でマウントしたりしても、build 時に wp-config.php 自体が上書きされてしまうため、こちらで設定したい項目が消えてしまいます。

これに気付き、理解するのに本当に時間がかかりました、、、

それもあって、公式の Dockerfile を利用するのは諦めて、独自路線に舵を切りました。今となっては Dockerfile 内部の動きを多少なりにも理解できるようになったため良い経験になったと思っていますが、当時は絶望していました(笑)

そのため、今回は Entrypoint で wp-config.php を生成するのではなく、単純に ローカルで編集した wp-config.php を Dockerfile 側で追加するようにしています。

1# Copied WordPress config
2ADD wp-config.php ${WP_PATH}/wp-config.php

/wp-content のパーミッションを変更してメディアファイルを保存できるように変更

良く見かける奴で画像や動画をアップロードできなくなる問題です。管理画面からファイルをアップロードする場合、一般ユーザーとしてサーバーにアクセスするのですが、この一般ユーザーに書き込み権限が与えられてないために起きるエラーのように見えます。

そのため Dockerfile 側で /wp-content のパーミッションを 0707 にして、管理画面からファイルをアップロードできるようにしています。

1# Change authority
2RUN set -ex; \
3chmod -R 0707 \
4${WP_PATH}/wp-content;

おわりに

今回は WordPress を扱い易くするため独自にカスタマイズした Dockerfile を作成しました。ミドルウェアからアプリケーションまで コード管理下(Docker)に置くのは、設定のサーバ環境依存や属人化を防げたりと、開発や運面でも非常にメリットが大きいかなと思います。

また、個人的には、コアな設定を Docker に閉じ込めることで、コンテナデプロイが簡単になるのが何より美味しいかなと思っています(汗)

参考文献


プロフィール画像

canji

とにかく私的にサービスを作りたい発作を起こしている。お腹はペコペコ。

  • toLog Tools icon
  • dots icon