WP-CLIのDocker公式イメージ「wordpress:cli」の使い方

この記事では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イメージの使い方については以下を参照してください。

【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その4:docker-composeってなに? 〜

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での使用についてはまだ課題が多いようです。

最後までお読みいただきありがとうございます。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です