インフラ

Dockerを使ったWordPressプラグイン開発環境構築時に発生した問題

MMM Corporation
gene

最近、 WordPress のプラグインを開発している。
開発環境として、 WordPressDocker公式イメージを利用しているが、いくつか想定していなかった動きがあったので、今回はその内容と対応方法について簡単にまとめておく。

開発環境前提

docker-compose.yml

開発環境の docker-compose.yml は、下記のDockerの公式のドキュメントを参考にしてほぼそのまま使う形で開始した。

【参考URL】
Quickstart: Compose and WordPress

ただ、プラグインやテーマを配置するディレクトリについては、開発しやすいようにそれぞれ plugins themes ディレクトリを作り、ボリュームマウントする形で設定をした。

version: '3.1'

services:

  wp:
    image: wordpress:5.4.0
    restart: always
    ports:
      - 3000:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - ./plugins:/var/www/html/wp-content/plugins
      - ./themes:/var/www/html/wp-content/themes

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  db:

発生した問題

管理画面からプラグインのインストールが出来ない

現象

WordPress の管理画面からプラグインを検索して、インストールしようとしたところ、下記のような画面が表示されてインストールが出来なかった。

原因

コンテナ内を調べてみると、 pluginsthemes ディレクトリ含め、その上のディレクトリである wp-content ディレクトリのオーナーが root になってしまっていた。

# ls -la wp-content/
total 12
drwxr-xr-x 4 root     root     4096 Apr 25 01:59 .
drwxrwxrwx 5 www-data www-data 4096 Apr 25 01:59 ..
-rw-r--r-- 1 www-data www-data   28 Jan  8  2012 index.php
drwxr-xr-x 5 root     root      160 Apr 25 01:59 plugins
drwxr-xr-x 6 root     root      192 Apr 25 01:59 themes
# ls -ld wp-content
drwxr-xr-x 4 root root 4096 Apr 25 01:59 wp-content

コンテナ内で WordPress は、 www-data ユーザーで起動しているため、書き込み権限が無くてプラグインがインストールが出来ない状況だった。

対応方法

こちらの問題は、 GitHub 上でも報告されていた。

【参考URL】
wp-content is owned by root on creation · Issue #436 · docker-library/wordpress

対応方法として、 docker-compose.yml で下記のようにコマンドを指定する箇所を追記し、該当のディレクトリに www-data ユーザーで書き込めるように設定してみた。

command: bash -c "/bin/chown -R www-data:www-data /var/www/html && apache2-foreground"

これで正常にプラグインのインストールが出来た!

……かと思ったが、下記の問題が発生してしまった。

別環境でDockerコンテナを起動するとApacheからエラーが返る

現象

上記の docker-compose.yml を使って、別のチームメンバーが Docker を起動すると、Apacheからエラーが返ってしまい、正常に表示できなくなってしまった。

エラーの内容を見てみると、どうやら /var/www/html/ ディレクトリ配下に、 WordPress が正常にインストールされていない状況のようだった。

[Sat Apr 25 03:20:38.357035 2020] [autoindex:error] [pid 19] [client 192.168.32.1:53998] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.php,index.html) found, and server-generated directory index forbidden by Options directive

原因

Docker のエントリーポイントとして指定されている wordpress/docker-entrypoint.sh の処理内容を確認すると、

if [[ "$1" == apache2* ]] || [ "$1" == php-fpm ]; then

となっており、コマンドとして渡ってくるものが、 apache2 で始まるものか、 php-fpm かどうかの判定を行っていた。
その後の処理で、 WordPress が無ければコピーする処理が入っており、今回指定していた

command: bash -c "/bin/chown -R www-data:www-data /var/www/html && apache2-foreground"

は、条件に合致しなかったため、 WordPress がコピーされていないということが判明した。

対応方法

対応としては、新規で起動スクリプト apache2_start_wp_container.sh を作成。
処理内容としては、 command で指定していたものを記述。

#!/bin/bash
chown -R www-data:www-data /var/www/html/wp-content
apache2-foreground

それを新規で作成した Dockerfile 内でコンテナ内にコピーし、

FROM wordpress:5.4.0
COPY ./apache2_start_wp_container.sh /usr/local/bin/apache2_start_wp_container.sh

docker-compose.yml 側で、下記のように command 指定することで

command: apache2_start_wp_container.sh

正常起動することが出来た。
最終的な docker-compose.yml は下記の通りとなった。

version: "3.1"

services:
  wp:
    build: .
    ports:
      - 3000:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - ./plugins:/var/www/html/wp-content/plugins
      - ./themes:/var/www/html/wp-content/themes
    command: apache2_start_wp_container.sh

  db:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: "1"
    volumes:
      - db:/var/lib/mysql

volumes:
  db:

まとめ

今回は Docker を使った WordPress プラグイン開発環境構築時に発生した問題と対応方法について、個人的な備忘録を兼ねてまとめてみた。
もし同じような問題にぶち当たってしまって困っている方がいたら、少しでも参考になると幸いである。

AUTHOR
gene
gene
記事URLをコピーしました