Windows パソコンにDocker で構築したWordpress の環境で、Search Replace DB のページがエラーで表示できず苦労した話。
Search Replace DB がエラーで表示されない
このブログのコピーをローカルに作りたかった。
Dockerでwebサーバ、DBサーバを起動して、このブログのデータを投入するだけの簡単なお仕事だと思っていた。
適当にググったサイトからyamlファイルをコピーしつつ適当に自分用に修正してコンテナ起動。
このブログのWordpressのファイルとDBをコピー。
ドメインをlocalhostに入れ替えるために Search Replace DB を設置して、さあブラウザでアクセスだ。

> このページは動作していません
> localhost では現在このリクエストを処理できません。
> HTTP ERROR 500
Search Replace DB のページがエラーで表示されない。
問題が発生した環境
- 使用したイメージ
- wordpress:latest (php 8.2, wordpress 6.8 だった)
- mysql:5.7
- Search-Replace-DB-master
- 現時点の最新版。v4.1.4。githubからダウンロード。
色々試してみたところ、 wordpress:latest と Search Replace DB の最新バージョンの組み合わせだとエラーになってしまう様子。
問題の回避方法
wordpress:latestのイメージとSearch Replace DB の両方が最新版だとダメそうなので、以下のどれかの方法でどちらかを変えてあげたら問題は回避できた。
古いWordpressのDockerイメージを使う
wordpressのイメージをlatestではなくちゃんとタグを指定してあげる方法。
latestではphp8.2だったので、php7.4を使うようにしたところ、Search Replace DBが表示できた。
compose.yaml はこんな感じ
services:
wordpress:
image: wordpress:php7.4 #latestではなくphp7.4を指定
container_name: wordpress_web
restart: always
depends_on:
- db
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wp_db
WORDPRESS_DB_USER: wp_db_user
WORDPRESS_DB_PASSWORD: wp_db_password
volumes:
- "./.data/wp:/var/www/html"
db:
image: mysql:5.7
container_name: wordpress_db
restart: always
environment:
MYSQL_DATABASE: wp_db
MYSQL_USER: wp_db_user
MYSQL_PASSWORD: wp_db_password
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- "./.data/mysql:/var/lib/mysql"
古いSearch Replace DB を使う
wordpress のイメージはlatestのまま、Search Replace DBのバージョンを落としても正常に表示することができた。
githubでバージョンを指定してダウンロードしたものを使えばOK。簡単。
最新版は 4.1.2 でしたが、3.1 を使います。
githubでバージョンを指定して…

ダウンロード

このときのcompose.yaml はこんな感じ。というか最初に HTTP ERROR 500 が出たときのものと何も変えていない。
services:
wordpress:
image: wordpress:latest
container_name: wordpress_web
restart: always
depends_on:
- db
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wp_db
WORDPRESS_DB_USER: wp_db_user
WORDPRESS_DB_PASSWORD: wp_db_password
volumes:
- "./.data/wp:/var/www/html"
db:
image: mysql:latest
container_name: wordpress_db
restart: always
environment:
MYSQL_DATABASE: wp_db
MYSQL_USER: wp_db_user
MYSQL_PASSWORD: wp_db_password
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- "./.data/mysql:/var/lib/mysql"
Search Replace DB をwordpressとは別のコンテナとして起動する
wordpress:latest が原因ならSearch Replace DBはコンテナを分ければいいじゃない。
ということでちゃんとSearch Replace DBのイメージもあった。
services:
wordpress:
image: wordpress:latest
container_name: wordpress_web
restart: always
depends_on:
- db
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wp_db
WORDPRESS_DB_USER: wp_db_user
WORDPRESS_DB_PASSWORD: wp_db_password
volumes:
- "./.data/wp:/var/www/html"
db:
image: mysql:5.7
container_name: wordpress_db
restart: always
environment:
MYSQL_DATABASE: wp_db
MYSQL_USER: wp_db_user
MYSQL_PASSWORD: wp_db_password
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- "./.data/mysql:/var/lib/mysql"
srdb:
container_name: wordpress_srdb
image: kgaut/docker-search-replace-db
ports:
- 8888:80
environment:
DB_HOST: db
DB_USER: wp_db_user
DB_PASS: wp_db_password
DB_NAME: wp_db
depends_on:
- db
これで http://localhost:8888 にアクセスすればSearch Replace DB が表示されます。
このイメージで使ってる Search Replace DB のバージョンは3.1みたい。

Dockerの思想的にはコンテナを分けるこの方法が正解ですか?
まとめ
根本的な原因は分からないけどとりあえず回避できたからまあよしとしよう。
githubにはPHP 8.x でも動くようなこと書いてある気がするけどなあ。