【Docker】Mysql2::Error: Host '~~~~~~~' is not allowed to connect to this MySQL server

どうもてぃです。
dockerでDB周りのエラーにかなり悩まされます。
今までPostgreSQLを使っていたので対処は出来ていたのですが、今回はMySQLです。
結構大変でしたが無事解決。
構成
docker-compose.ymlで作成しています。
version: '3.7'
services:
db:
image: mysql:5.7
ports:
- '3306:3306'
volumes:
- mysql-data:/var/lib/mysql
env_file:
- .env
redis:
image: redis:5.0.7
ports:
- '6379:6379'
volumes:
- redis-cache:/var/lib/redis/data
web:
build:
context: .
dockerfile: ./docker/rails/Dockerfile.rails
command: bash -c "rm -rf tmp/pids/*; bundle exec unicorn -E ${RAILS_ENV} -c config/unicorn.rb"
depends_on:
- db
- redis
ports:
- '3000:3000'
environment:
- RAILS_ENV
volumes:
- .:/myapp
- /myapp/log
- /myapp/.git
- bundle:/usr/local/bundle
tty: true
stdin_open: true
env_file:
- .env
worker:
build:
context: .
dockerfile: ./docker/rails/Dockerfile.rails
command: bundle exec sidekiq -C config/sidekiq.yml -e ${RAILS_ENV}
depends_on:
- db
- redis
environment:
- RAILS_ENV
volumes:
- .:/myapp
env_file:
- .env
nginx:
build:
context: ./docker/nginx
dockerfile: ./Dockerfile.nginx
depends_on:
- web
ports:
- '8020:8020'
volumes:
mysql-data:
driver: local
redis-cache:
driver: local
bundle:
driver: local
rails(unicorn) × nginx × mysql × sidekiq(redis)で構成しています。
これ作るのわりかししんどかった。
unicorn × nginxを作ったのが初めてだったので。
やったこと
環境変数がちゃんと設定されているかまず確認。
いや、dbコンテナの構成にenv_fileとして設定しているのでここは特に問題無いと思う。
docker-compose run db /bin/bashでコンテナに入って環境変数を確認したけどちゃんと入ってた。
一応以下の手順で確認できる。
$ docker-compose run db /bin/bash
$ echo ${MYSQL_ROOT_PASSWORD}
# => でた
打つ手なし
です。
諦めてながら最後の手段で永続化していたmysqlのvolumeを削除してしまいます。
$ docker volume ls # => ~~~~_mysql-data $ docker volume rm ~~~~_mysql-data # volume削除完了
データベース作成してみる
$ docker-compose run web bundle exec rails db:create
Can't connect to MySQL server on 'db' (111 "Connection refused")
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>"password", "host"=>"db", "database"=>"docker_rails_development"}
rails aborted!
Mysql2::Error: Can't connect to MySQL server on 'db' (111 "Connection refused")
/usr/local/bundle/ruby/2.5.0/gems/mysql2-0.4.9/lib/mysql2/client.rb:89:in `connect'
/usr/local/bundle/ruby/2.5.0/gems/mysql2-0.4.9/lib/mysql2/client.rb:89:in `initialize'
/usr/local/bundle/ruby/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/mysql2_adapter.rb:22:in `new'
/usr/local/bundle/ruby/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/mysql2_adapter.rb:22:in `mysql2_connection'
/usr/local/bundle/ruby/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:809:in `new_connection'
/usr/local/bundle/ruby/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:853:in `checkout_new_connection'
以下略
$ docker-compose run web bundle exec rails db:create
Starting docker-rails_db_1 ... done
Starting docker-rails_redis_1 ... done
(0.4ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
↳ bin/rails:9
(0.2ms) CREATE DATABASE `docker_rails_development` DEFAULT CHARACTER SET `utf8`
↳ bin/rails:9
Created database 'docker_rails_development'
(0.2ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
↳ bin/rails:9
(0.2ms) CREATE DATABASE `docker_rails_test` DEFAULT CHARACTER SET `utf8`
↳ bin/rails:9
Created database 'docker_rails_test'
なぜか作成できたんやが。
いろいろと調べてみる
トップに出たきたのがstackoverflowのやつ。
やっぱり環境変数について言及してる感じだった。
qiitaもそういう記事が多数。
でも自分は環境変数設定しているので同じ現象ではない。謎すぎる。
終わり
と思ってたら、同じ現象の人いた。
この人も自分と同じで、volume削除してdb作成したらうまく行った…と。
コンテナだし、まだ構成の途中だし、困ったらvolumeもimageも全部ぶち壊して作り直しましょう。
それがdockerの醍醐味ですよ。学びましたわ。
以上。