前提
https://www.engilaboo.com/laravel-docker/
上記記事のデータベース接続でエラーが出てつまづいた。
試したこと
まず、php artisan migrate
をしているところがアプリケーションのコンテナ内じゃなかったのがダメだった。
(コンテナ内からの呼び出しはdbとかdocker-compose.yamlに記載のもので接続する。逆にコンテナ外からの呼び出しは、大体 127.0.0.1 で呼び出せる)
なので、execでアプリケーションコンテナに入って実行。
コンテナに入ってコマンドをうっても、以下エラーがでた。
SQLSTATE[HY000] [1045] Access denied for user 'user'@'172.20.0.3' (using password: YES) (SQL: select * from information_schema.tables where table_schema = database and table_name = migrations and table_type = 'BASE TABLE')
dockerのMYSQLではlocalhost(172.20.0.3)で接続できないエラーのよう。
(172.20.0.3はdockerが勝手に振ったホスト、いずれにせよlocalhostを意味する。)
参考記事
https://codeaid.jp/blog/docker-mysql-php/
解決方法
mysqlのログインユーザーに権限をもたせると解消されるらしく、.envのDB_USERNAMEをrootにしたらエラーが解消された。
docker-compose.yamlのDB_USERNAMEをrootにするとエラーでmysqlコンテナが立ち上がらなくなるので注意。
rootユーザーは%
権限をもっているからだとおもう。
おまけ
userのままでもmysqlから権限を付与すれば対応可能か?と試行錯誤
docker-compose exec db bash
でmysqlコンテナに入って
mysql -u root -p
で、パスワードを入力してmysqlに接続したら、
GRANT ALL ON
データベース名.* TO 'ユーザー名'@'%' ;
こんな感じで権限を付与すればいけるはず。
最初の設定であれば、
GRANT ALL ON
database.* TO 'user'@'%' ;
とすれば解決のはずが、なぜかログインしているroot権限で他のユーザーにGRANTできずw
エラー内容。
ERROR 1410 (42000): You are not allowed to create a user with GRANT
当該ユーザーの作成のときにlocalhost をつけないと表示されるようだ。
https://note.com/haraaa/n/n8ea4986ec3b5
ユーザーを一度削除してから作り直した
DROP USER 'user'@'localhost';
CREATE USER 'user'@'172.20.0.3' IDENTIFIED BY 'pass';
GRANT ALL ON
database.* TO 'user'@'%' ;
https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql-ja
dockerからlaravelをインストールしてmysql接続がこんな手数あるはずないので、もっとスマートなやり方があるはず。最初からMYSQL_USERをrootにしておくのがいいのかな。