Rubyと筋肉とギターとわたし

筋トレが仕事です

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

f:id:rdwbocungelt5:20180816164743p:plain

どうもてぃです。

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のやつ。

やっぱり環境変数について言及してる感じだった。

github.com

qiitaもそういう記事が多数。

でも自分は環境変数設定しているので同じ現象ではない。謎すぎる。

終わり

と思ってたら、同じ現象の人いた。

matsu.teraren.com

この人も自分と同じで、volume削除してdb作成したらうまく行った…と。

コンテナだし、まだ構成の途中だし、困ったらvolumeもimageも全部ぶち壊して作り直しましょう。

それがdockerの醍醐味ですよ。学びましたわ。

以上。