0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PHPコンテナからDBコンテナにmysqlコマンドを通す方法

Posted at

はじめに

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系に対応した場合にはもとに戻すようにしましょう。

調べた時に参考にした記事一覧

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?