はじめに
PHPコンテナ内(のバッチ処理ロジックの中)でmysqlコマンドを使いたいと思ったのですが、いろいろつまずいたので調べたことを備忘録として残したいと思います。
他にも困った人がいた時に役立てば幸いです。
対象者
- Docker使用者
- PHPコンテナとDBコンテナが分かれている
- PHPコンテナ内でMySQLコマンドを直接使いたい(exec()関数の使用)
私の場合は、Laravelを普段使っていて、下記のucan様の記事をベースに自分用にカスタマイズしたものを使っています。
動作確認環境
- MySQL 8.0(mysql/mysql-server:8.0)
- PHP 8.0(php:8.0-fpm-buster)
つまずきポイント
コマンドがない
mysql -u {user_name} -h {コンテナ名} -p
↓
bash: mysql: command not found
PHPコンテナにはmysqlのコマンドがありませんでした。
なかったのでインストールします。
// 最新化
apt update
// インストールできる内容を表示
apt search mysql-client
// コマンドのインストール
apt install -y default-mysql-client-core
これでインストールできたはずなので、もう一度叩いてみます
mysql -u {user_name} -h {コンテナ名} -p
↓
Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
mysqlのコマンドは通ったようです。しかし認証まわりのエラーが発生しました。
認証エラー
調べた結果、上のエラーはMySQL8から導入された認証まわりの設定が原因であることが分かりました。
MySQL5.7までの認証プラグインはmysql_native_passwordというものが使われていたのが、8.0からはcaching_sha2_passwordというものに変わったようです。
しかしながらmysqlクライアント側が新しい認証にはまだ対応できていないため、認証を従来の形式に戻したいと思います。
DBコンテナに入り、以下のコマンドを実行することで該当ユーザーの認証を変更することができます。
なお、権限変更はrootユーザーなど、権限の強いユーザーで実行する必要があります。
// 現在の状況確認
SELECT User, Host, Plugin FROM mysql.user;
// 権限変更
ALTER USER {user_name} IDENTIFIED WITH mysql_native_password BY '{password}';
// 権限が変更されたことを確認
SELECT User, Host, Plugin FROM mysql.user;
もう一度確認
権限が変更されたので、もう一度PHPコンテナに戻りmysqlコマンドを実行し通るか確認します。
mysql -u {user_name} -h {コンテナ名} -p
↓
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 8.0.25 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
無事にPHPコンテナからDBコンテナにmysqlコマンドが通りました!
補足
MySQL8ではcaching_sha2_passwordが推奨されていますので、mysqlクライアント側が8系に対応した場合にはもとに戻すようにしましょう。
調べた時に参考にした記事一覧