ringo_0418
@ringo_0418 (りんご)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Docker上のWordPressで、突然MySQLが動かなくなりました

概要

ご覧いただきありがとうございます。

私は業務で多くのWordPressサイトを立ち上げる必要があり、DockerとWP-CLIを使って開発環境を構築しています。

通常下記の流れで開発環境を立ち上げていたのですが、数日前より開発環境が上手く立ち上がらなくなってしまいました。

  1. Gitからドットファイルとwp-content配下のファイルをクローンしてくる
  2. yarnでパッケージをインストールする
  3. .envファイルを書き換える
  4. mkcertで.envファイルに書かれたドメインから証明書を発行する
  5. WP-CLIで日本版のWordPressコアファイルをダウンロードしてくる
  6. コンテナを立ち上げる ←今回問題が発生した場所
  7. コンテナの中に入る
  8. WordPressセットアップ用のWP-CLIコマンド集が書かれたシェルスクリプトを実行する
  9. コンテナから出てドメインをhostsに追加する

丸1日以上の調査の結果、 docker compose -p test up -d --build 時の wp-config.php ファイルの生成に問題がありそうと考えていますが、どうしても原因がわからず、皆様のお力をお貸しいただきたいです。

正常に動いていた以前の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';

今回要因の一つになっていることが推測されるwp-config.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
/etc/hosts
127.0.0.2 dev.test.com
.env
# 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=

docker-compose.yml
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.ymlrestart: 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_USERroot から user へ変更
  • docker-compose.yml の MYSQL_USERMYSQL_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で動作可能にしたいと考えております。

ちなみにもう一台のデバイスでも試しましたが、そちらは同じ環境で正常に動いております。

ぜひお知恵をお貸しいただければ幸いでございます。

0

2Answer

wordpressからの引用です。

NOTE: Since March 2021, WordPress images use a customized wp-config.php that pulls the values directly from the environment variables defined above (see wp-config-docker.php in docker-library/wordpress#572 and docker-library/wordpress#577). As a result of reading environment variables directly, the cli container also needs the same set of environment variables to properly evaluate wp-config.php.

2021年3月からカスタマイズされたwp-config.phpが使用されるようになったみたいですね。

もしネイティブのwp-config.phpを使用したいのであれば、次の選択肢があると思います。

  1. ネイティブのwp-config.phpに自分で置き換える
  2. 最新バージョンのイメージ(latest)ではなく、2021年3月以前のバージョンを使用する
  3. このイメージを使用しない
2Like

Comments

  1. @ringo_0418

    Questioner

    ありがとうございます!
    なるほど、そんな変更があったのですね...!

    cliコンテナを使っているつもりが無かったので読み飛ばしてしまっていたのですが、最新のイメージではgetenv_dockerが利用されたwp-config.phpが利用されるということですね。

    ご提案いただいた方法を試してみようと思います。

    どうにもならず途方に暮れていたので、大変助かりました。
    本当にありがとうございました!

dbのコンテナが起動しない、ということであれば問題はそれ自体にあり、wp-config.phpの影響は考えにくいと思います。
もしwp-config.phpに問題があるのなら、正常に動いていた以前のwp-config.phpに戻すことで一旦は解決するのではないでしょうか?

エラー文の提案通り、下記を変更すると立ち上がるようにはなりますが、 dev.test.com へアクセスすると「データベース接続確立エラー」の表示となってしまいます。
.env の MYSQL_USER を root から user へ変更
docker-compose.yml の MYSQL_USER と MYSQL_PASSWORD をコメントアウト

MYSQL_USERMYSQL_PASSWORDをコメントアウトしてしまったので、ユーザとそのパスワードが設定されず、接続できなくなったのだと思います。

「MYSQL_USER="root"」の時はMYSQL_USERMYSQL_PASSWORDが使用できない、ということなので解決方法は2つです。

  1. ユーザをroot以外にする場合、MYSQL_USERがroot以外になるよう設定する
  2. ユーザをrootのままにする場合、MYSQL_USERMYSQL_PASSWORDを削除して、推奨されている3つのどれかでパスワードを設定する
0Like

Comments

  1. @ringo_0418

    Questioner

    @blue32a様

    早速ご回答いただきありがとうございます。

    質問文に記載しておらず申し訳ございませんが、実はお答えいただいたことも試しており、正常に動作することは確認できております。

    しかしwp-config.phpの内容がネイティブのものから少し離れており、メンテナンス性の観点から、wp-configを以前のような記述方式にしつつ解決することが理想です。

    ご説明不足で申し訳ありません。

    もし上記踏まえて解決案がありましたら、ご教示いただければ幸いです。

    何卒よろしくお願いいたします。
  2. そもそもですが、`wp-config.php`を変更した経緯は何でしょうか?
    以前のファイルに戻せない事情があるのでしょうか?
  3. @ringo_0418

    Questioner

    ご返信ありがとうございます。

    故意に変更しているのではなく、 `docker-compose -p test up -d --build` した際に、自動生成されています。

    手動でしたら以前のファイルに戻せるのですが、開発環境を立ち上げる機会が多いため、理想のwp-config.phpが自動生成されていた先日の状態に戻す術があればお伺いしたい次第です。
  4. wp-config.phpは開発環境を立ち上げる度に生成されなければいけないものでしょうか?
    wp-cliは詳しくないのですが、通常こういったものは最初のプロジェクト作成時に1度だけ生成されれば良いものだと思います。

    wordpressコンテナの詳細や、この環境を作る時に参考にした情報などはありますか?
  5. @ringo_0418

    Questioner

    ご返信ありがとうございます。

    おっしゃる通り、プロジェクト作成時に1度だけ生成されれば問題ございません。
    「開発環境を立ち上げる機会が多い」と申しましたので誤解を与えてしまったかもしれませんが、正しくは「プロジェクトを立ち上げる機会が多い」でした。

    以下、コンテナ詳細(Dockerfile)をお送りいたします。
    ----------------------------------------------------
    FROM wordpress:latest

    # 必要なツールのインストール
    RUN apt update \
    && apt -y install sudo zsh vim git locales-all \
    && chsh -s /bin/zsh \
    && curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \
    && chmod +x wp-cli.phar \
    && mv wp-cli.phar /usr/local/bin/wp \
    && wp --info

    # .vimrcと.zshrcをコピー
    COPY conf/.vimrc /root/
    COPY conf/.zshrc /root/

    # 証明書をコピー
    COPY certs/ /etc/ssl/private
    COPY conf/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf

    # SSLモジュールとバーチャルホストの有効化
    RUN a2ensite default-ssl \
    && a2enmod ssl

    # 不要になった一時ファイルを削除
    RUN apt clean
    RUN rm -rf /tmp/*

    # サーバが読めるように wp-content 以下の所有者を変更
    RUN chown -R www-data:www-data /var/www/html/wp-content

    # WordPressコンテナにmailhog用の設定を追加
    RUN curl --location --output /usr/local/bin/mhsendmail https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64 && \
    chmod +x /usr/local/bin/mhsendmail

    RUN echo 'sendmail_path="/usr/local/bin/mhsendmail --smtp-addr=mailhog:1025 --from=admin@example.com"' > /usr/local/etc/php/conf.d/mailhog.ini

    WORKDIR /var/www/html
    ----------------------------------------------------

    また環境は少し前に作ったのでうろ覚えですが、下記の記事などを参考にしたと思います。
    https://docs.docker.jp/compose/wordpress.html
    https://beacats.com/how_to_build_wordpress_on_docker/

    よろしくお願いいたします。

Your answer might help someone💌