この記事ではWP-CLIのDocker公式イメージを使用する方法についてまとめています。
WP-CLIとは
WP-CLIとはオープンソースのCMSであるWordPressをコマンドラインで操作するためのツールです。
GUIベースの操作は直感的でわかりやすいですが、コマンドさえ知っていればGUIよりも素早く実行でき、スクリプトに組み込めば自動化もできるのでCUIも何かと便利です。例えばプラグインのアップデートを定期実行したり、複数サイトの同じ作業を一括で処理できたりします。
WP-CLIは以下から提供されています。
公式サイト: https://wp-cli.org/ja/
このWP-CLIを使うための公式コンテナイメージが公開されているので、今回はこちらを使用してみたいと思います。
wordpress:cliの仕組み
wordpress:cliは以下から提供されています。
WordPressのdockerイメージ: https://hub.docker.com/_/wordpress
以下は上記docker hubのreadmeの抜粋です。
$ docker run -it --rm \ --volumes-from some-wordpress \ --network container:some-wordpress \ -e WORDPRESS_DB_USER=... \ -e WORDPRESS_DB_PASSWORD=... \ # [and other used environment variables] wordpress:cli user list
wordpress:cliにはWordPress本体がインストールされていません。が、WP-CLIはWordPressのインストールデータを直接触るものではなく、WordPress本体の機能を呼び出すものなのでWordPressがインストールされていないと使用できません。
なのでこのイメージではWordPress本体がインストールされているディレクトリをマウントする必要があります。上記の例では「–volumes-from」と「–network」で指定しています。
wordpress:cliはCMDでWP-CLIを実行するwpコマンドを待ち受けており、コンテナビルド時にサブコマンドを指定することでWP-CLIコマンドを実行しています。上記の例では「user list」を指定しているのでコンテナ内で「wp user list」が実行されます。
コマンド実行後、コンテナは終了します。コマンド発行の度にコンテナを使い捨てるイメージです。
docker-composeでの使い方
docker runで実行するのは公式readmeで説明されているので、ここではdocker-composeでの使いかたを説明します。
以下がdocker-compose.ymlの例です。
version: '3' services: mysql: image: mysql:8.0.20 container_name: sql restart: always volumes: - mysql_data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: wordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - mysql image: wordpress:latest container_name: wordpress volumes: - wordpress_data:/var/www/html ports: - "8080:80" restart: always environment: WORDPRESS_DB_HOST: mysql:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress cli: image: wordpress:cli container_name: cli volumes_from: - wordpress depends_on: - mysql - wordpress command: "--info" user: xfs environment: WORDPRESS_DB_HOST: mysql:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: mysql_data: wordpress_data:
cliコンテナに絞って解説します。WordPressイメージの使い方については以下を参照してください。
WordPressコンテナのボリュームをマウントします。wordpressで指定していますが、WordPressコンテナのデフォルトのインストールディレクトリは「/var/www/html」です。
volumes_from: - wordpress
デフォルトのコマンドとして「–info」を与えています。wpコマンドは引数なしでは動かないため、サブコマンドを与えなかったときにおかしな動作をしないように指定しています。
command: "--info"
実行ユーザを指定します。これはwordpress:latestとwordpress:cliのディストリビューションが異なために必要になります。wordpress:latest(WordPress本体)はdebianですが、wordpress:cliはalpineで作られています。これら2つのディストリビューションでは各ユーザに割り当てられるUIDが異なります。WordPressの操作にはwww-dataというユーザが使われますが、wordpress:cliでwww-dataを実行ユーザに指定しても、操作するのはWordPress本体のディレクトリになります。UIDが異なるのでalpineで実行ユーザを指定してもdebian側では別のユーザだと認識されてしまいます。なのでwordpress:cliではdebianのwww-dataと同じUIDのユーザを指定する必要があります。WordPress本体(debian)側のwww-dataと同じUIDなのがcli(alpine)側のxfsというユーザなのです。
なので対策としてはこのように実行ユーザをxfsに指定するか、WordPress本体側もalpineのイメージを使用するかのどちらかとなります。
user: xfs
環境変数を指定します。環境変数に指定するべきものは「WordPressコンテナと同じ環境変数」です。2021年3月以前はWordPressコンテナからこの値を取得していたのですが、アップデートに伴い自身に与えられた環境変数を参照する仕様になっています。
environment: WORDPRESS_DB_HOST: mysql:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress
以下のコマンドでWP-CLIを実行できます。
$ docker-compose run --rm cli user list
Kubernetesでは使えない?
Kubernetesで使用する方法については色々と試行錯誤しましたが、公式イメージはKubernetesと相性がよくありません。
wordpress:cliはコマンド実行の度にPodを使い捨てる仕様になっています。しかし、Kubernetesにはコンテナを使い捨てるという発想がありません。そのため、使用後もPodが残ってしまい、実行の度に完了状態のPodが増えていくことになります。また、1つのコンテナを何度も起動するという想定がないため、マニフェストファイルに実行ごとに引数を与えられません。
スクリプトを使えば解決できないこともありませんが、そこまでして使う意味はないように思います。
KubernetesでWordPressとWP-CLIを使いたければ、WP-CLIをインストールしたイメージを作るのが一番良いのではないでしょうか。
まとめ
この記事ではWP-CLIのDocker公式イメージをdocker-composeとKubernetesで使用する方法についてまとめました。
Kubernetesでの使用についてはまだ課題が多いようです。
最後までお読みいただきありがとうございます。