Laradockで構築したMySQLに繋がらない[2018年8月]

Laradockロゴ
出典:https://github.com/laradock/laradock

Laravelの開発環境の構築には、以下の2通りの方法が一般的。

  • Homestead
    • vagrantベース
  • Laradock
    • dockerベース

最近Laradockで構築してみたところ、DB周りで躓いてしまったため、備忘録。

現象

Laradockをcloneし、特に.envの値を変更せずdocker-compose up -d workspace nginx mysqlで開発環境を構築した。
そのままLaravelプロジェクトを作成しアプリからmysqlへの接続を試みたところ、認証エラーが発生した。

原因

MySQLのバージョンが8であり、デフォルトの認証プラグインがmysql_native_passwordからcaching_sha2_passwordへ変更となったため。

https://yoku0825.blogspot.com/2018/01/mysql-804.html

Laradockでは、初期状態ではDocker Hub上に公開されているうち最新のMySQLイメージを使用するようになっており、2018年8月現在では上記がインストールされる。
一方、同時点でPHPの接続ライブラリはcaching_sha2_passwordに対応していない。

対策

新規環境であればどちらかの対応。

  1. デフォルト認証プラグインの指定(mysql_native_password)
  2. MySQLバージョンの指定(5.7以前)

参考元にあるように直接

対策1. デフォルト認証プラグインの指定

laradock/mysql/my.cnfにて、従来の認証プラグインを使用するよう以下を記載

 [mysqld]
default_authentication_plugin=mysql_native_password  # この行を追加

基本的にはこちらで良いと思う。

対策2. MySQLバージョンの指定

laradock/.envにて、5.7以前のバージョンを指定する。

### MYSQL #################################################

MYSQL_VERSION=latest     # ← 5.7等に変更する
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d

その他

一度mysql環境をビルドしている場合は、永続化されているDBデータを削除する必要あり。

対策1の場合、認証プラグインはユーザ作成時にユーザ毎に設定されるため、作成済のユーザに関しては適用されないため。どうしてもそのままDBを使用したい場合はALTER USERで直接mysql.userテーブルを更新する必要あり。

対策2の場合、8.0のDBをそのまま5.7で使用するのは無理があるため。

対応

ホストマシンのlaradock/.envにて指定しているパスを確認して、フォルダを削除する。

DATA_PATH_HOST=~/.laradock/data
# cd ~/.laradock/data
# sudo rm -r mysql

まとめ

PHPで標準対応していないものはめんどくさい

0 件のコメント :

コメントを投稿