前提
docker for mac(またはwindows)がインストールされ、公式に沿ってDockerfile等が作られていること。
さらに公式手順の「docker-compose up」まで実行されている状態であること。
docker-compose.ymlファイルだけ以下のようにアレンジしました。
version: '3'
services:
db:
image: mysql
command: --default-authentication-plugin=caching_sha2_password
# mysqlデータのマウントポイントを設定
volumes:
- ./tmp/db:/var/lib/mysql/data
environment:
MYSQL_ROOT_PASSWORD: hao123
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/app
ports:
- 3000:3000
depends_on:
- db
tty: true
working_dir: "/app"
# database.ymlで使用する環境変数
environment:
DB_USER: root
DB_PASSWORD: hao123
DB_HOST: db
発生した謎のエラー
以下のコマンドを実行後、エラーが出てしまう。
ネットで調べても解決策が見つからなかったので、メモを残しておきます。
ちなみdocker-compose.ymlでもdbと指定してるし、database.ymlとの整合性が取れていることも確認済み。
「Unknown MySQL server host 'db'」だと?!
君は何を言ってるんだい?^ ^
USERnoMBP:app user$ docker-compose run web rake db:create
Starting app_db_1 ... done
Unknown MySQL server host 'db' (-2)
Couldn't create 'app_development' database. Please check your configuration.
rake aborted!
Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2)
/usr/local/bundle/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect'
/usr/local/bundle/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `initialize'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/mysql2_adapter.rb:22:in `new'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/mysql2_adapter.rb:22:in `mysql2_connection'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:811:in `new_connection'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:855:in `checkout_new_connection'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:834:in `try_to_checkout_new_connection'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:795:in `acquire_connection'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:523:in `checkout'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:382:in `connection'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:1014:in `retrieve_connection'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_handling.rb:118:in `retrieve_connection'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_handling.rb:90:in `connection'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/tasks/mysql_database_tasks.rb:6:in `connection'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/tasks/mysql_database_tasks.rb:14:in `create'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/tasks/database_tasks.rb:119:in `create'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/tasks/database_tasks.rb:139:in `block in create_current'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/tasks/database_tasks.rb:316:in `block in each_current_configuration'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/tasks/database_tasks.rb:313:in `each'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/tasks/database_tasks.rb:313:in `each_current_configuration'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/tasks/database_tasks.rb:138:in `create_current'
/usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/railties/databases.rake:29:in `block (2 levels) in <top (required)>'
/usr/local/bundle/gems/rake-12.3.3/exe/rake:27:in `<top (required)>'
Tasks: TOP => db:create
(See full trace by running task with --trace)
原因
docker-compose等のファイルを再確認しましたが、オカシイ部分が見つからなかったです。
念の為docker-compose.ymlのvolumesのマウント元(/var/lib/mysql/data)のディレクトリがあるか調べてたら、dataというファイルまたはディレクトリが存在しないことがわかった。
volumes:
- ./tmp/db:/var/lib/mysql/data → ここの部分
よって、マウント元のディレクトリが存在しない場合は上記のエラーが起きるということがわかりました。
おそらく今回の場合、マウントが失敗してdbホストが作られなかったと考えられる。