Copilot CLIでWordPress on Docker その2

Copilot CLIでWordPress on Dockerの続き。

プラグインとテーマのインストール(と更新)

プラグインとテーマファイルの準備

インストールしたいプラグインをローカルのenv/production/plugins以下に、同じくテーマをenv/production/themes以下にダウンロードして置く。

Dockerfileの修正

FROM wordpress:5.9.3

COPY env/production/config/wp-config.php /var/www/html/wp-config.php
RUN rm -rf /var/www/html/wp-content/plugins
COPY env/production/plugins /var/www/html/wp-content/plugins
RUN rm -rf /var/www/html/wp-content/themes
COPY env/production/themes /var/www/html/wp-content/themes

公式イメージに最初から入ってるpluginsとthemesを削除して、自分で自分で準備したものに差し替えるかんじ。

デプロイ

copilot svc deploy --name wordpress --env staging

ファイルは設置されたのでWordPressの管理画面からインストールすればOK。

プラグインやテーマの更新

プラグインやテーマの更新は、ローカルのファイルを更新してデプロイ。
このローカルに置いてあるファイルが正となるのでgitなどでバージョン管理しておくといいでしょう。

WordPressの管理画面から更新ポチポチはしないし、プラグインやテーマの自動更新も有効にはしない。
理由としては以下のWordPressの更新と同様。

WordPressの更新

ついでにWordPress本体の更新をどうするかと言う話。
これはWordPressのバージョンアップが出たらDockerfileを修正して再デプロイが基本。

コンテナ運用の場合は現時点で動いているコンテナではなく、Dockerfileが正ということになるので、コンテナの方を更新してもいつ元に戻るか分からない。
再デプロイしたり、コンテナが何かの原因で死んで再生成されたり、スケールで増えたりするとDockerfileで記述されたバージョンに戻る。

これによって自動アップデートの恩恵を受けられなくなるのは弱み。
下手するとセキュリティホール放置なんてことになりかねない。

メジャーバージョンも上がっていいなら公式イメージでwordpress:latestを使いつつ自動更新有効でいいが、メジャーバージョンの自動更新はさすがに怖すぎる。プラグインとかテーマとかなぎ倒すことがあるので。

バージョンアップを検知してCI/CDパイプラインを組むとこまでいければいいのかもしれない。

既存のWordPressのDBをインポート

今までは新規構築の話だったが、移行するケースの場合はDBのインポートをアドホックにコンテナ上から行う。

移行元からmysqldumpしてzipで固めたmysql_dump.sql.zipを使ってインポートする想定。

Dockerfileの修正

FROM wordpress:5.9.3

COPY env/production/config/wp-config.php /var/www/html/wp-config.php
RUN rm -rf /var/www/html/wp-content/plugins
COPY env/production/plugins /var/www/html/wp-content/plugins
RUN rm -rf /var/www/html/wp-content/themes
COPY env/production/themes /var/www/html/wp-content/themes

RUN apt-get update && apt-get install -y default-mysql-client unzip
COPY env/production/mysql_dump.sql.zip /var/www/html
RUN unzip /var/www/html/mysql_dump.sql.zip

インポートするためにmysqlコマンドが必要になるので、それを使えるようにするついでにMySQLのダンプファイルもコンテナにコピーする。

デプロイ

copilot svc deploy --name wordpress --env staging

コンテナ内に入ってmysqlコマンド

copilot svc exec

素晴らしいことにこれでWordPresssの動いているコンテナ内に入れるので、mysqlコマンドでインポート。

mysql -u admin -h my-wordpress-staging-wordpre-wordpressdbdbcluster-xxxxxxxxxxxx.cluster-xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -p wordpress_db < mysql_dump.sql

DBの接続情報は環境変数に入っているのでenvで確認できる。

Dockerfileを元に戻す

インポートは一度やったら二度とやらないのでDockerfileは元に戻しておく。デプロイもしなおしておくと完璧。

残りのタスク

  • S3でメディアファイルを配信
  • ログをCloudWatch Logsに流す
  • メールをSESで配信する
  • 本番環境の構築

メール配信どうするのって話が生えてきた。

記事

前の記事

Copilot CLIでWordPress on Docker