概要
PHP コンテナと MySQL コンテナを Docker で管理している環境で、
特に設定を変えていないのに、ある日突然 MySQL 接続時にエラーが出るようになった。
調べてみると、下記構成になっていることが原因でした。
- DB サーバー側は MySQL 8.4
- クライアント側(PHP コンテナの mysql コマンド)は MariaDB Client
これにより、MySQL 側が自己署名証明書付きの TLS を有効化したことで、MariaDB Client 側が弾かれるようになっていた。
同じ構成の人がハマりそうなので、対応方法をメモとして残します。
環境
DB サーバー(コンテナ)
- MySQL 8.4.7
Client サーバー(コンテナ)
- PHP 8.2 (php-fpm)
- MariaDB Client 11.8
※ PHP コンテナ内で mysql コマンドを実行すると、MariaDB Client が使われている状態。
エラーの内容
Laravel の migration / schema load 実行時に、以下のエラーが発生。
Symfony\Component\Process\Exception\ProcessFailedException
The command "mysql --user="${:LARAVEL_LOAD_USER}" --password="${:LARAVEL_LOAD_PASSWORD}" --host="${:LARAVEL_LOAD_HOST}" --port="${:LARAVEL_LOAD_PORT}" --database="${:LARAVEL_LOAD_DATABASE}" < "${:LARAVEL_LOAD_PATH}"" failed.
Exit Code: 1(General error)
Working directory: /var/www
Output:
================
Error Output:
================
ERROR 2026 (HY000): TLS/SSL error: self-signed certificate in certificate chain
at vendor/symfony/process/Process.php:269
対応方法(開発環境)
結論
MariaDB Client 側で SSL を無効化する。
そのために、my.cnf を用意して conf.d に配置します。
my.cnf の内容
[client]
ssl=0
MariaDB Client では、この指定で TLS を完全に無効化できます。
Dockerfile
例:PHPコンテナのDockerfile
FROM php:8.2-fpm
ENV TZ=Asia/Tokyo
COPY php.ini /usr/local/etc/php/
RUN apt-get update \
&& apt-get install -y zlib1g-dev libzip-dev mariadb-client libpng-dev unzip libicu-dev
# MariaDB/MySQL client config (dev): disable TLS so `mysql` CLI won't fail on self-signed certs
COPY my.cnf /etc/mysql/conf.d/zz-client.cnf
RUN chmod 644 /etc/mysql/conf.d/zz-client.cnf
RUN docker-php-ext-install zip pdo_mysql gd intl
# Composer install
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
WORKDIR /var/www
RUN composer global require "laravel/installer"
ポイント
- /etc/mysql/my.cnf は パッケージインストール時に上書きされることがある
- /etc/mysql/conf.d/*.cnf は確実に読み込まれる
- zz- プレフィックスを付けて、後勝ちにしている