出典: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
へ変更となったため。
Laradockでは、初期状態ではDocker Hub上に公開されているうち最新のMySQLイメージを使用するようになっており、2018年8月現在では上記がインストールされる。
一方、同時点でPHPの接続ライブラリはcaching_sha2_passwordに対応していない。
対策
新規環境であればどちらかの対応。
- デフォルト認証プラグインの指定(mysql_native_password)
- 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 件のコメント :
コメントを投稿