以前作った CentOS7 + Apache + PHP7 + MySQL + phpMyAdmin の LAMP開発環境 の Docker Compose に .env
の値によって WP-CLI の有無を条件分岐する、ということをやってみることにしました。
ちなみに、 Docker は設定ファイルをシンプルに保つために自前では if文 は持っていないようです。そのため、エントリポイントのシェルスクリプトで実行することにします。
コード
.env
# 略
WP_CLI=false
.env
の最後に WP_CLI
の行を追加。これが true
ならば WP-CLI をインストールする、としたいと思います。
docker-compose.yml
entrypoint: bash -c "bash /workspace/entrypoint_web.sh $WEB_ROOT_DIRECTORY $WEB_DOMAIN $WEB_HOST_PORTNUM $WEB_CONTAINER_PORTNUM $WEB_HOST_PORTSSL $WEB_CONTAINER_PORTSSL $WP_CLI && /bin/bash"
Docker Compose のエントリポイントで、Webサーバ向けのエントリポイントに $WP_CLI
を引数として追加。
entrypoint_web.sh
# WP CLI
if [ "$7" = 'true' ]; then
cd ~
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
mv wp-cli.phar /usr/local/bin/wp
fi
最後にシェルスクリプトで if文 を追加。
検証
これで docker-compose up -d
。
> docker-compose exec web /bin/bash
# wp cli version --allow-root
bash: wp: command not found
#
ないと言われました。想定通り。いったん docker-compose down
でコンテナを壊してから
# 略
WP_CLI=true
WP_CLI=true
としてもう一度 docker-compose up -d
でビルド。
> docker-compose exec web /bin/bash
# wp cli version --allow-root
WP-CLI 2.5.0
#
OKです。
検証2
ついでに実際に WordPress サイトをクローンしてみます。
SFTPなりFTPなりでファイル一式と、 phpMyAdmin 等でSQL文としてDBをバックアップしてきます。
hosts
に
127.0.0.1 wpdocker.example.jp
等としてクローンサイトの名前解決をできるようにします。 .env
でドメインやポートを調整。
これで http://wpdocker.example.jp:8081
で phpMyAdmin にアクセスし、実際の環境と同じデータベースを作成して、その中にSQLをインポート。
続いてファイル一式を Docker の Apache のドキュメントルートに配置。
wp-config.php
で
/** MySQL のホスト名 */
//define('DB_HOST', 'localhost');
define('DB_HOST', 'db');
のようにして設定を調整をし、サブディレクトリインストールの WordPress ならば .htaccess
も調整 (.htaccess
は WP-CLi での置換の対象外のため)。
これで WP-CLI で置換します。
> docker-compose exec web /bin/bash
# cd /var/www/wpdocker/web/
# wp search-replace --recurse-objects 'https://wporigin.example.jp/subdir/installed' 'https://wpdocker.example.jp:4043' --allow-root
+------------------+-----------------------+--------------+------+
| Table | Column | Replacements | Type |
+------------------+-----------------------+--------------+------+
| wp_commentmeta | meta_key | 0 | SQL |
| wp_commentmeta | meta_value | 0 | SQL |
| wp_comments | comment_author | 0 | SQL |
| wp_comments | comment_author_email | 0 | SQL |
| wp_comments | comment_author_url | 0 | SQL |
| wp_comments | comment_author_IP | 0 | SQL |
| wp_comments | comment_content | 0 | SQL |
| wp_comments | comment_approved | 0 | SQL |
| wp_comments | comment_agent | 0 | SQL |
| wp_comments | comment_type | 0 | SQL |
| wp_links | link_url | 0 | SQL |
| wp_links | link_name | 0 | SQL |
| wp_links | link_image | 0 | SQL |
| wp_links | link_target | 0 | SQL |
| wp_links | link_description | 0 | SQL |
| wp_links | link_visible | 0 | SQL |
| wp_links | link_rel | 0 | SQL |
| wp_links | link_notes | 0 | SQL |
| wp_links | link_rss | 0 | SQL |
| wp_options | option_name | 0 | SQL |
| wp_options | option_value | 15 | PHP |
| wp_options | autoload | 0 | SQL |
| wp_postmeta | meta_key | 0 | SQL |
| wp_postmeta | meta_value | 12 | PHP |
| wp_posts | post_content | 183 | SQL |
| wp_posts | post_title | 0 | SQL |
| wp_posts | post_excerpt | 0 | SQL |
| wp_posts | post_status | 0 | SQL |
| wp_posts | comment_status | 0 | SQL |
| wp_posts | ping_status | 0 | SQL |
| wp_posts | post_password | 0 | SQL |
| wp_posts | post_name | 0 | SQL |
| wp_posts | to_ping | 0 | SQL |
| wp_posts | pinged | 0 | SQL |
| wp_posts | post_content_filtered | 10 | PHP |
| wp_posts | guid | 2748 | SQL |
| wp_posts | post_type | 0 | SQL |
| wp_posts | post_mime_type | 0 | SQL |
| wp_term_taxonomy | taxonomy | 0 | SQL |
| wp_term_taxonomy | description | 0 | SQL |
| wp_termmeta | meta_key | 0 | SQL |
| wp_termmeta | meta_value | 0 | SQL |
| wp_terms | name | 0 | SQL |
| wp_terms | slug | 0 | SQL |
| wp_usermeta | meta_key | 0 | SQL |
| wp_usermeta | meta_value | 0 | PHP |
| wp_users | user_login | 0 | SQL |
| wp_users | user_nicename | 0 | SQL |
| wp_users | user_email | 0 | SQL |
| wp_users | user_url | 0 | SQL |
| wp_users | user_activation_key | 0 | SQL |
| wp_users | display_name | 0 | SQL |
+------------------+-----------------------+--------------+------+
Success: Made 2968 replacements.
#
OK。
これで他Webサーバ機能が上がっていないことを確認しつつ https://wpdocker.example.jp:4043/
にアクセス。
クローンサイトにアクセスできることを確認。 WP-CLI できちんとDBの置換も効いていることが確認できました。OKです。