##はじめに
ポートフォリオ制作のためDockerにて新たに環境構築をしました。今回は新たにWEBサーバーにnginxを導入して構築しました。(Docker+Rails6+puma+nginx+mysql)
その際起きたデータベース接続エラーにかなり時間をとられてしまったので同じエラーで悩んでる方のためにも対応策を書き留めておこうと思います。
環境
- windows10 Pro
- Rails: 6.0.3.2
- ruby: 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
- Docker for windows
- MySQL 5.6
- nginx:1.15.8
##データベース接続エラー
こちらの記事を参考に環境構築を進めていた時
docker-compose exec app rails db:create
をしたら以下のようなエラーが発生しました。
Mysql2::Error::ConnectionError: Access denied for user 'ユーザー名'@'%' to database 'webapp_development'
Couldn't create 'webapp_development' database. Please check your configuration.
どうやらデータベースにアクセスを拒否されてDBの作成に失敗したようです。DBのvolumeを削除してコンテナ再起動してみたりするも変わらず、、パスワードもちゃんと設定してあっているしタイポもしてないしいったいなぜ拒否されたんだろう?とだいぶ悩みました。volumeを削除してコンテナ再起動してみたりするも変わらず、、
##原因
結論から言いますと原因はDBへアクセスするユーザーに権限がなかったからです。(**ちなみにdbのvolumeも一旦削除する必要があります。**DBコンテナの仕組み上そうしなければならないようです(postgresqlとかも))
ここに気付くまでだいぶ時間がかかってしまいました。おそらく僕と同じように独学で勉強している方だと同じ場面でかなり悩むと思います。
##解決策
dbのvolumeを削除しコンテナを再起動後、DBへアクセスできるようにユーザーに権限を付与すればいいだけです。
まず、コンテナが停止していたら起動し、コンテナ内に入りルートユーザーでMySQLに接続します。
docker-compose up -d
docker-compose exec db bash
root@b8d3d3c0300f:/# mysql -u root -p
パスワードを設定している人は-pオプションを付けてパスワードを入力してください。
いつものmysqlの画面になります。
Welcome to the MySQL monitor. Commands end with ; or \g.
...
(中略)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
ここでユーザーについている権限を確認します。
mysql> SHOW GRANTS for 'hoge'@'%';
+----------------------------------+
| Grants for hoge@% |
+----------------------------------+
| GRANT USAGE ON *.* TO 'hoge'@'%' |
+----------------------------------+
1 row in set (0.00 sec)
SHOW GRANTS for 'ユーザー名'@'%';
でそのユーザーに付与されている権限を確認することができます。
上のUSAGEというのは何も権限がないことを意味しており、これがDB接続エラーの原因だったのです。
このユーザーにすべての権限を付与(スーパーユーザー)します。
mysql> GRANT ALL ON *.* TO 'kiyo'@'%';
権限を確認します。
mysql> SHOW GRANTS for 'kiyo'@'%';
+-------------------------------------------+
| Grants for kiyo@% |
+-------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'kiyo'@'%' |
+-------------------------------------------+
1 row in set (0.00 sec)
ALLはすべての権限を意味しますのでしっかりと権限付与できていることが確認できます。
これで完了です!
最初に権限を確認したとき、USAGEになっていた方はおそらくこれで接続できるようになると思います。
##最後まで読んでいただきありがとうございました。
この記事を読んで少しでも解決になれば幸いです!また何か解釈に誤りなどございましたらご指摘いただけると幸いです。