起きた事象
MySQLとRailsの環境をdocker-composeで作成し、DBを作成しようとしたら下記のエラーになりました。
$ docker-compose run web rails db:create
・
・
・
Can't connect to MySQL server on 'db' (115)
Couldn't create 'app_development' database. Please check your configuration.
rails aborted!
ActiveRecord::ConnectionNotEstablished: Can't connect to MySQL server on 'db' (115)
Caused by:
Mysql2::Error::ConnectionError: Can't connect to MySQL server on 'db' (115)
Tasks: TOP => db:create
(See full trace by running task with --trace)
解決まで半日ぐらいかかりましたので備忘録をこめてこちらに記載しておきます。
私は初学者のため、当たり前すぎることの記載や間違い等もあるかもしれないので予めご了承ください。
環境
- Rails:7.0.4
- Ruby:3.1.2
- MySQL:
dockerimage:8.0.31
結論
結論から述べますと、database.ymlのpasswordの値をダブルコーテーションで囲んでいないのが原因でした。(おそらく)
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: "password" # ←passwarodから修正
host: db
こちら を修正しまして、再度
$ docker-compose run web rails db:create
を実行すると正しくDBが作成されました。
おそらく、ymlがうまく読み取れていなかったのが原因のようです。。。
いろんな記事を参考にしていましたが、上記のように記載されている記事はなかったので穴でした。
私だけかもしれませんが、参考になれば幸いです。
経緯と参考記事
この結論にいたるまでの道のりと参考記事をこちらに記載していきます。
おかげさまで勉強になったのは間違いないので、、、
環境変数とは
まず問題があるとすれば3つのファイルのうちどこかの設定が間違えているのだろうと思い色々試してみました。
- docker-compose.yml
- config/database.yml
- .env(参照できていない?)
エラーの内容からDBに接続出来ていないんだなと思い、docker-compose.ymlのmysql部分について再度勉強し直しました。
環境変数(environment句)とはなんなのか。パスワードは.envに記載するべきなのか検討してみました。
こちらの記事をがとても参考になりました。
※最初からドキュメントを読むのも手です。
MYSQL_ROOT_PASSWORD
MYSQL_DATABASE
MYSQL_USER
MYSQL_PASSWORD
上記がこんがらがっていたのでいろんな手を使って修正してみましたが、ずっとタイトルと同じエラーでした。。
そんな時にこちらの記事を拝見しまして、そんなんで治るわけないだろ。。と思いながらやってみると直りました。。。
結局docker-composeのパスワードは.envに記載するべきなのか
いろんな記事を見ているともちろん.envに記載する人もいましたが、大多数が.envに記載せず直書きしていました。
すごく心配でしたが、そもそもdockerというものの性質上、不要でないと意味ないのではないかと思い始めました。
コンテナの特性としてポータビリティ(一貫性)があります。
それを考えた時に.envファイルを使わないと環境を構築できないのは結構致命的だと思いました。
てかそもそもコンテナは仮想空間に作るものなので、自身のmysqlのroot権限がとかパスワードがとかどうとか関係ないんですよね。
もちろん.envファイルを使用しなければいけない場面もあるとは思いますが。。
※初学者なので、認識の違いがあればご指摘いただけれ幸いです。
まとめ
今回、docker-composeの良い勉強となり結果よかったです。
まずは理解しないとやっぱりダメだなと思いました。
ただ手を動かして分からない部分を詰めていくように、outputからinputする方が良いのかもしれません。
終わり。
参考記事
https://teratail.com/questions/317758
https://qiita.com/croquette0212/items/7b99d9339fd773ddf20b