ActiveRecord::DatabaseConnectionErrorの解消
Q&A
Closed
ActiveRecord::DatabaseConnectionErrorの解消
やりたいこと
- DockerでRailsとMySQLを接続し、ハローワールドしたい
エラー内容
**ActiveRecord::DatabaseConnectionError
There is an issue connecting to your database with your username/password, username: root.
Please check your database configuration to ensure the username/password are valid.**
Mysql2::Error::ConnectionError: Access denied for user 'root'@'172.23.0.3' (using password: YES)
docker compose up でコンテナを立ち上げ、localhost.3000を訪れると上記エラーが返される
別ターミナルでdocker compose run web rake db:create
を打っても同様
調査
- 公式をちゃんと読む
postgresの説明だが、デフォルトだとlocalhostに行っちゃうからdbにしとけよ、と書かれてる
The app is now bootable, but you're not quite there yet. By default, Rails expects a database to be running on
localhost
- so you need to point it at thedb
container instead. You also need to change the database and username to align with the defaults set by thepostgres
image.
自分の理解のメモ
config/database.ymlはrails側の設定で、docker-compose.ymlはdockerのコンテナの設定。
-
config/database.ymlについて
- adapter, encoding,ユーザー名、パス、ホスト等を指定する。
-
docker-compose.ymlについて
- 今回はサービスが二つ、dbとwebがあり、二つコンテナがある。サービスdbの中のenvironmentに環境変数を記述でき、userやpassを記述した
原因
-
おそらく、docker-compose.ymlとconfig/database.ymlの間における情報の齟齬
-
docker-compose.yml側
services:
db:
image: mysql:latest
ports:
- "13306:3306"
volumes:
- ./.data/db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: user
MYSQL_PASSWORD: password
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
- config/database.yml側
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: user
password: password
host: db
development:
<<: *default
database: myapp_development
試したこと
- config/database.ymlファイルの改行コードをLFにする
- Docker上でMySQLの対話モードに入ろうとする
- 変わらず
- docker-compose.ymlのMYSQL_USER, MYSQL_PASSWORDを削除、config/database.ymlのusernameをuserに
- 変わらず
- docker volume lsを打って、volumeの確認
- ない
- コンテナ削除、イメージ削除から作り直し2回
- 変わらず
参考
こちらのgithubを元にpostgresではなくmysqlで進めていた