検索

Dorcker版WordPressのコンテナからphp-fpmコンテナに乗り換える

Docker版Wordpressの中で動いてんのはWrodPress動かすまでの設定やパッケージ導入を一気に済ませたphp-fpm。たまに勘違いする人がいるがwordpressというプロセスが動いてる分けではない。WordPressコンテナ+nginxコンテナの構成で使ってたのを普通のphp-fpmコンテナ+nginxコンテナの構成で使うようにしたかったので、その時色々躓いた箇所があったのでメモしておく。dokcer環境からホストOS上で動かすってときもちょっとだけ参考になるかも?

そのまま動かすとエラーが出る

Docker版WordPressに入ってたwordpressのファイル群をそのまま使ってもwp-configがコンテナ内の環境変数を参照する特別仕様なのでそのままだと動かないのと、php-fpmコンテナがデフォだとmysql使うための関数使えないので修正する。

php-fpm周り

ここをやっておかないと、”Uncaught Error: Call to undefined function mysql_connect()”ってエラー出る。

mysqliが必要なのでインストールして有効化

Dockerfile

FROM php:fpm-alpine
RUN apk update && apk upgrade && \
docker-php-ext-install mysqli && docker-php-ext-enable mysqli
Code language: CSS (css)

そして今回使ってるベースイメージのalpineは執筆時は3.14なんだけどうちの環境だとdockerfileのビルドに失敗したのでホストOS側のパッケージ群をアップデートしたら解決。まぁdockerのバージョンが20.10.0以降かrunc v1.0.0-rc93以降のどっちかが入っときゃいい感じらしい?

以下の記事参考。
https://wiki.alpinelinux.org/wiki/Release_Notes_for_Alpine_3.14.0#faccessat2
https://gitlab.alpinelinux.org/alpine/aports/-/issues/12396

/usr/local/etc/php/php.iniをいじってmysqliを使えるようにする

最初は入ってないけど同一ディレクトリにphp.ini-productionってファイルが落ちてるのでそれリネームして使うか、Docker版WordPressにも入ってるので元々設定済みの持ってる人はそっから流用するのもあり。”extension=mysqli”っていう記述があるのでコメントアウトを外す。てかなんでこんなキモイ場所にあるんだろう。

Before
;   extension=mysqli
After
  extension=mysqli

wp-configの設定

たぶんそのままだと”Error establishing a database connection”が表示されるはず。getenv_docker()という関数でdockerの環境変数から値を持ってくる処理だったり他にもいらない処理があるので修正する。

いらない記述の削除orコメントアウト

以下2つの記述は不要。たぶん。

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;
		}
	}
}
Code language: PHP (php)
// (we include this by default because reverse proxying is extremely common in container environments)
if ($configExtra = getenv_docker('WORDPRESS_CONFIG_EXTRA', '')) {
	eval($configExtra);
}
Code language: PHP (php)

DB周りの記述。

Before
// ** 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', 'DBの名前') );
/** MySQL database username */
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'ユーザネーム') );
/** MySQL database password */
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'DBのパスワード') );
/** 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', '') );
Code language: PHP (php)
After
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'DBの名前' );
/** MySQL database username */
define( 'DB_USER', 'DBのユーザネーム' );
/** MySQL database password */
define( 'DB_PASSWORD', 'DBのパスワード' );
/** MySQL hostname */
define( 'DB_HOST', 'DBのホスト名。' );
/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );
/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
Code language: PHP (php)

なんかの認証用の鍵っぽいもの

Before
define( 'AUTH_KEY',         getenv_docker('WORDPRESS_AUTH_KEY',         'hogehogehogehogehogehogehogehogehogehoge') );
define( 'SECURE_AUTH_KEY',  getenv_docker('WORDPRESS_SECURE_AUTH_KEY',  'hogehogehogehogehogehogehogehogehogehoge') );
define( 'LOGGED_IN_KEY',    getenv_docker('WORDPRESS_LOGGED_IN_KEY',    'hogehogehogehogehogehogehogehogehogehoge') );
define( 'NONCE_KEY',        getenv_docker('WORDPRESS_NONCE_KEY',        'hogehogehogehogehogehogehogehogehogehoge') );
define( 'AUTH_SALT',        getenv_docker('WORDPRESS_AUTH_SALT',        'hogehogehogehogehogehogehogehogehogehoge') );
define( 'SECURE_AUTH_SALT', getenv_docker('WORDPRESS_SECURE_AUTH_SALT', 'hogehogehogehogehogehogehogehogehogehoge') );
define( 'LOGGED_IN_SALT',   getenv_docker('WORDPRESS_LOGGED_IN_SALT',   'hogehogehogehogehogehogehogehogehogehoge') );
define( 'NONCE_SALT',       getenv_docker('WORDPRESS_NONCE_SALT',       'hogehogehogehogehogehogehogehogehogehoge') );
Code language: JavaScript (javascript)
After
define( 'AUTH_KEY',         'hogehogehogehogehogehogehogehogehogehoge' );
define( 'SECURE_AUTH_KEY',  'hogehogehogehogehogehogehogehogehogehoge' );
define( 'LOGGED_IN_KEY',    'hogehogehogehogehogehogehogehogehogehoge' );
define( 'NONCE_KEY',        'hogehogehogehogehogehogehogehogehogehoge' );
define( 'AUTH_SALT',        'hogehogehogehogehogehogehogehogehogehoge' );
define( 'SECURE_AUTH_SALT', 'hogehogehogehogehogehogehogehogehogehoge' );
define( 'LOGGED_IN_SALT',   'hogehogehogehogehogehogehogehogehogehoge' );
define( 'NONCE_SALT',       'hogehogehogehogehogehogehogehogehogehoge' );
Code language: JavaScript (javascript)

おそらくDBのテーブルの接頭辞の設定らしきもの

Before
$table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');
Code language: PHP (php)
After
$table_prefix = 'wp_';
Code language: PHP (php)

デバックモードのやつ

Before
define( 'WP_DEBUG', !!getenv_docker('WORDPRESS_DEBUG', '') );
Code language: JavaScript (javascript)
After
define( 'WP_DEBUG', False );
Code language: PHP (php)