Dockerを使ったWordPressプラグイン開発環境構築時に発生した問題
最近、 WordPress
のプラグインを開発している。
開発環境として、 WordPress
のDocker公式イメージを利用しているが、いくつか想定していなかった動きがあったので、今回はその内容と対応方法について簡単にまとめておく。
開発環境前提
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
の管理画面からプラグインを検索して、インストールしようとしたところ、下記のような画面が表示されてインストールが出来なかった。
原因
コンテナ内を調べてみると、 plugins
や themes
ディレクトリ含め、その上のディレクトリである 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
プラグイン開発環境構築時に発生した問題と対応方法について、個人的な備忘録を兼ねてまとめてみた。
もし同じような問題にぶち当たってしまって困っている方がいたら、少しでも参考になると幸いである。