Docker で構築した CentOS7 + Apache + PHP7 + MySQL + phpMyAdmin の LAMP開発環境 でパラメータから WP-CLI の有無を条件分岐する

以前作った 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です。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。