どうもてぃです。
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の醍醐味ですよ。学びましたわ。
以上。