Docker上のWordPressで、突然MySQLが動かなくなりました
概要
ご覧いただきありがとうございます。
私は業務で多くのWordPressサイトを立ち上げる必要があり、DockerとWP-CLIを使って開発環境を構築しています。
通常下記の流れで開発環境を立ち上げていたのですが、数日前より開発環境が上手く立ち上がらなくなってしまいました。
- Gitからドットファイルとwp-content配下のファイルをクローンしてくる
- yarnでパッケージをインストールする
- .envファイルを書き換える
- mkcertで.envファイルに書かれたドメインから証明書を発行する
- WP-CLIで日本版のWordPressコアファイルをダウンロードしてくる
- コンテナを立ち上げる ←今回問題が発生した場所
- コンテナの中に入る
- WordPressセットアップ用のWP-CLIコマンド集が書かれたシェルスクリプトを実行する
- コンテナから出てドメインをhostsに追加する
丸1日以上の調査の結果、 docker compose -p test up -d --build
時の wp-config.php
ファイルの生成に問題がありそうと考えていますが、どうしても原因がわからず、皆様のお力をお貸しいただきたいです。
<?php
/**
* WordPress の基本設定
*
* このファイルは、インストール時に wp-config.php 作成ウィザードが利用します。
* ウィザードを介さずにこのファイルを "wp-config.php" という名前でコピーして
* 直接編集して値を入力してもかまいません。
*
* このファイルは、以下の設定を含みます。
*
* * MySQL 設定
* * 秘密鍵
* * データベーステーブル接頭辞
* * ABSPATH
*
* @link https://ja.wordpress.org/support/article/editing-wp-config-php/
*
* @package WordPress
*/
// 注意:
// Windows の "メモ帳" でこのファイルを編集しないでください !
// 問題なく使えるテキストエディタ
// (http://wpdocs.osdn.jp/%E7%94%A8%E8%AA%9E%E9%9B%86#.E3.83.86.E3.82.AD.E3.82.B9.E3.83.88.E3.82.A8.E3.83.87.E3.82.A3.E3.82.BF 参照)
// を使用し、必ず UTF-8 の BOM なし (UTF-8N) で保存してください。
// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define('DB_NAME', 'wordpress');
/** MySQL データベースのユーザー名 */
define('DB_USER', 'root');
/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'password');
/** MySQL のホスト名 */
define('DB_HOST', 'db:3306');
/** データベースのテーブルを作成する際のデータベースの文字セット */
define('DB_CHARSET', 'utf8');
/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', '');
/**#@+
* 認証用ユニークキー
*
* それぞれを異なるユニーク (一意) な文字列に変更してください。
* {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org の秘密鍵サービス} で自動生成することもできます。
* 後でいつでも変更して、既存のすべての cookie を無効にできます。これにより、すべてのユーザーを強制的に再ログインさせることになります。
*
* @since 2.6.0
*/
define('AUTH_KEY', 'ランダム英数字');
define('SECURE_AUTH_KEY', 'ランダム英数字');
define('LOGGED_IN_KEY', 'ランダム英数字');
define('NONCE_KEY', 'ランダム英数字');
define('AUTH_SALT', 'ランダム英数字');
define('SECURE_AUTH_SALT', 'ランダム英数字');
define('LOGGED_IN_SALT', 'ランダム英数字');
define('NONCE_SALT', 'ランダム英数字');
/**#@-*/
/**
* WordPress データベーステーブルの接頭辞
*
* それぞれにユニーク (一意) な接頭辞を与えることで一つのデータベースに複数の WordPress を
* インストールすることができます。半角英数字と下線のみを使用してください。
*/
$table_prefix = 'wp_';
/**
* 開発者へ: WordPress デバッグモード
*
* この値を true にすると、開発中に注意 (notice) を表示します。
* テーマおよびプラグインの開発者には、その開発環境においてこの WP_DEBUG を使用することを強く推奨します。
*
* その他のデバッグに利用できる定数についてはドキュメンテーションをご覧ください。
*
* @link https://ja.wordpress.org/support/article/debugging-in-wordpress/
*/
define('WP_DEBUG', true);
define('WP_DEBUG_DISPLAY', false);
define('WP_DEBUG_LOG', 'true');
define('DISALLOW_FILE_EDIT', 'true');
/* 編集が必要なのはここまでです ! WordPress でのパブリッシングをお楽しみください。 */
/** Absolute path to the WordPress directory. */
if (!defined('ABSPATH')) {
define('ABSPATH', __DIR__ . '/');
}
/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
<?php
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the installation.
* You don't have to use the web site, you can copy this file to "wp-config.php"
* and fill in the values.
*
* This file contains the following configurations:
*
* * MySQL settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* This has been slightly modified (to read environment variables) for use in Docker.
*
* @link https://wordpress.org/support/article/editing-wp-config-php/
*
* @package WordPress
*/
// IMPORTANT: this file needs to stay in-sync with https://github.com/WordPress/WordPress/blob/master/wp-config-sample.php
// (it gets parsed by the upstream wizard in https://github.com/WordPress/WordPress/blob/f27cb65e1ef25d11b535695a660e7282b98eb742/wp-admin/setup-config.php#L356-L392)
// a helper function to lookup "env_FILE", "env", then fallback
if (!function_exists('getenv_docker')) {
// https://github.com/docker-library/wordpress/issues/588 (WP-CLI will load this file 2x)
function getenv_docker($env, $default) {
if ($fileEnv = getenv($env . '_FILE')) {
return rtrim(file_get_contents($fileEnv), "\r\n");
}
else if (($val = getenv($env)) !== false) {
return $val;
}
else {
return $default;
}
}
}
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'wordpress') );
/** MySQL database username */
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'example username') );
/** MySQL database password */
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'example password') );
/**
* Docker image fallback values above are sourced from the official WordPress installation wizard:
* https://github.com/WordPress/WordPress/blob/f9cc35ebad82753e9c86de322ea5c76a9001c7e2/wp-admin/setup-config.php#L216-L230
* (However, using "example username" and "example password" in your database is strongly discouraged. Please use strong, random credentials!)
*/
/** MySQL hostname */
define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', 'mysql') );
/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', getenv_docker('WORDPRESS_DB_CHARSET', 'utf8') );
/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', getenv_docker('WORDPRESS_DB_COLLATE', '') );
/**#@+
* Authentication unique keys and salts.
*
* Change these to different unique phrases! You can generate these using
* the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
*
* You can change these at any point in time to invalidate all existing cookies.
* This will force all users to have to log in again.
*
* @since 2.6.0
*/
define( 'AUTH_KEY', getenv_docker('WORDPRESS_AUTH_KEY', '2254296a55ca23263007c0028b03d61150895349') );
define( 'SECURE_AUTH_KEY', getenv_docker('WORDPRESS_SECURE_AUTH_KEY', 'b60fd478500e5f253072e6ca54177089a0dbe5dd') );
define( 'LOGGED_IN_KEY', getenv_docker('WORDPRESS_LOGGED_IN_KEY', 'f8fd9866fd51ee0388b5c7bfdcaf674a86e2a49d') );
define( 'NONCE_KEY', getenv_docker('WORDPRESS_NONCE_KEY', '67d99a340e071d11a7d2d7b8623f3d6b62c5e2b3') );
define( 'AUTH_SALT', getenv_docker('WORDPRESS_AUTH_SALT', '4b23626cc9644cbedb152b4143bbfee1402a77d6') );
define( 'SECURE_AUTH_SALT', getenv_docker('WORDPRESS_SECURE_AUTH_SALT', 'e0563d3ac0c5639270c9bf5c3fa266339eef91db') );
define( 'LOGGED_IN_SALT', getenv_docker('WORDPRESS_LOGGED_IN_SALT', 'c9a546581ab2304c0c9cd1e3c242725f464d37bc') );
define( 'NONCE_SALT', getenv_docker('WORDPRESS_NONCE_SALT', 'bba66e2b3beded52a678e2008d8306a1ac9f6f09') );
// (See also https://wordpress.stackexchange.com/a/152905/199287)
/**#@-*/
/**
* WordPress database table prefix.
*
* You can have multiple installations in one database if you give each
* a unique prefix. Only numbers, letters, and underscores please!
*/
$table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');
/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*
* For information on other constants that can be used for debugging,
* visit the documentation.
*
* @link https://wordpress.org/support/article/debugging-in-wordpress/
*/
define( 'WP_DEBUG', !!getenv_docker('WORDPRESS_DEBUG', '') );
/* Add any custom values between this line and the "stop editing" line. */
// If we're behind a proxy server and using HTTPS, we need to alert WordPress of that fact
// see also http://codex.wordpress.org/Administration_Over_SSL#Using_a_Reverse_Proxy
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
// (we include this by default because reverse proxying is extremely common in container environments)
if ($configExtra = getenv_docker('WORDPRESS_CONFIG_EXTRA', '')) {
eval($configExtra);
}
/* That's all, stop editing! Happy publishing. */
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
環境
ツール | バージョン他 |
---|---|
OS | MacOS 11.4 |
Docker Desktop for Mac | 20.10.7 |
Dockerイメージ | WordPress公式イメージ(latest) |
WordPress | latest |
MySQL | 8.0 |
phpMyAdmin | latest |
mailHog | latest |
yarn | 1.22.10 |
mkcert | 1.4.3 |
WP-CLI | 2.4.0 |
127.0.0.2 dev.test.com
# global
PRODUCTION_NAME=test
SITE_TITLE='test'
DOMAIN='dev.test.com'
# sudo ifconfig lo0 alias 127.0.0.$i up を 2〜10で実行することで、 172.0.0.10 までのローカルループバックアドレスを確保中
HOST_IP=127.0.0.2
# sql
MYSQL_ROOT_PASSWORD=password
MYSQL_USER=root
MYSQL_PASSWORD=password
MYSQL_DATABASE=wordpress
# wordpress
WORDPRESS_DB_HOST=db:3306
WORDPRESS_DB_USER=root
WORDPRESS_DB_PASSWORD=password
WORDPRESS_DB_NAME=wordpress
# phpmailer
PHP_MAILER_HOST=mailhog
PHP_MAILER_PORT=1025
PHP_MAILER_SMTP_AUTH=true
PHP_MAILER_SMTP_SECURE=false
PHP_MAILER_FROM=
PHP_MAILER_FROM_NAME=
# deploy
USER=
HOST=
PROJECT_DIR=
BACKUP_DIR=
SYNC_DIR=
version: '3.8'
services:
db:
container_name: ${PRODUCTION_NAME}_dev_db
image: mysql:8.0
volumes:
- ./sql/db_data:/var/lib/mysql
ports:
- ${HOST_IP}:3306:3306
restart: always
command: --max_allowed_packet=1G
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
wordpress:
container_name: ${PRODUCTION_NAME}_dev_wp
depends_on:
- db
restart: always
build: .
ports:
- ${HOST_IP}:80:80
- ${HOST_IP}:443:443
environment:
WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
PHP_MAILER_HOST: ${PHP_MAILER_HOST}
PHP_MAILER_PORT: ${PHP_MAILER_PORT}
PHP_MAILER_SMTP_AUTH: ${PHP_MAILER_SMTP_AUTH}
PHP_MAILER_SMTP_SECURE: ${PHP_MAILER_SMTP_SECURE}
PHP_MAILER_FROM: ${PHP_MAILER_FROM}
PHP_MAILER_FROM_NAME: ${PHP_MAILER_FROM_NAME}
volumes:
- .:/var/www/html
- ./php.ini:/usr/local/etc/php/conf.d/wp-recommended.ini
phpmyadmin:
container_name: ${PRODUCTION_NAME}_dev_pma
image: phpmyadmin/phpmyadmin:latest
depends_on:
- db
ports:
- ${HOST_IP}:8080:80
restart: always
volumes:
- ./php.ini:/usr/local/etc/php/conf.d/wp-recommended.ini
mailhog:
container_name: ${PRODUCTION_NAME}_dev_mailhog
image: mailhog/mailhog:latest
ports:
- ${HOST_IP}:8025:8025
- ${HOST_IP}:1025:1025
volumes:
- './mailhog:/tmp'
発生している問題・エラー
docker compose -p test up -d --build
すると、下記のようにdbのみ上手く立ち上がりません。
NAME SERVICE STATUS PORTS
test_dev_db db restarting
test_dev_mailhog mailhog running 127.0.0.2:1025->1025/tcp, 127.0.0.2:8025->8025/tcp
test_dev_pma phpmyadmin running 127.0.0.2:8080->80/tcp
test_dev_wp wordpress running 127.0.0.2:80->80/tcp, 127.0.0.2:443->443/tcp
docker-compose.yml
で restart: always
を指定しているため、runningとrestartingを繰り返している状態です。
sudo lsof -n -i:3306 -P
した結果からも、やはり正常に立ち上がっていないことが伺えます。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker logs test_dev_db
をした結果は、下記の通りです。
2021-06-18 06:33:51+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.25-1debian10 started.
2021-06-18 06:33:51+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2021-06-18 06:33:51+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.25-1debian10 started.
2021-06-18 06:33:51+00:00 [ERROR] [Entrypoint]: MYSQL_USER="root", MYSQL_USER and MYSQL_PASSWORD are for configuring a regular user and cannot be used for the root user
Remove MYSQL_USER="root" and use one of the following to control the root user password:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
エラー文の提案通り、下記を変更すると立ち上がるようにはなりますが、 dev.test.com へアクセスすると「データベース接続確立エラー」の表示となってしまいます。
- .env の
MYSQL_USER
をroot
からuser
へ変更 - docker-compose.yml の
MYSQL_USER
とMYSQL_PASSWORD
をコメントアウト
解決したいこと
docker compose -p test up -d --build
した際、上に挙げた「今回要因の一つになっていることが推測されるwp-config.php」ではなく、「正常に動いていた以前のwp-config.php」のようなwp-config.phpが生成され、且つブラウザからアクセスできるように戻したいです。
getenv_docker
の記載がある方のwp-config.phpでもやり方によっては解決可能かもしれませんが、本来のwp-config.phpと記述が少し異なるため、できれば以前のwp-config.phpで動作可能にしたいと考えております。
ちなみにもう一台のデバイスでも試しましたが、そちらは同じ環境で正常に動いております。
ぜひお知恵をお貸しいただければ幸いでございます。