質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

3回答

1232閲覧

【Docker】Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2)

kumamin

総合スコア12

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2020/10/07 11:37

前提・実現したいこと

今、以下の記事を参考に既存のRailsアプリにDockerを導入しようとしています。
【Docker】作成中Railsプロジェクトで開発環境構築
そこでエラーが起き、自力で解決できなかったので質問させていただきます。

発生している問題・エラーメッセージ

上記の記事を参考にしてファイルを作成・編集し、ターミナルに$ docker-compose buildを打ってから
$ docker-compose run web rails db:createというコマンドを打ったところ、以下のエラーが発生しました。

Unknown MySQL server host 'db' (-2) Couldn't create 'project_development' database. Please check your configuration. rails aborted! Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2)

該当のソースコード

▼Dockerfile

FROM ruby:2.6.5 RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/* RUN apt-get update && apt-get install -y mariadb-client --no-install-recommends && rm -rf /var/lib/apt/lists/* RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /workdir WORKDIR /workdir ADD Gemfile /workdir/Gemfile ADD Gemfile.lock /workdir/Gemfile.lock ENV BUNDLER_VERSION 2.0.1 RUN gem install bundler RUN bundle install ADD . /workdir

▼database.yml

default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password socket: /tmp/mysql.sock host: db development: <<: *default database: project_development username: root password: password database: project_development test: <<: *default database: project_test production: <<: *default database: project_production username: root password: <%= ENV['DATABASE_PASSWORD'] %> socket: /var/lib/mysql/mysql.sock

▼docker-compose.yml

version: '3' services: db: image: mysql:5.7.8 environment: MYSQL_DATABASE: project_development MYSQL_ROOT_PASSWORD: password MYSQL_USER: root MYSQL_PASSWORD: password volumes: - ./mysql/mysql_data:/var/lib/mysql ports: - "4306:3306" web: build: context: . dockerfile: Dockerfile command: /bin/sh -c "rm -f /workdir/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" tty: true stdin_open: true depends_on: - db ports: - "3000:3000" volumes: - .:/workdir

試したこと

以下の記事を参考に、全てのDockerイメージを削除してみましたが同じエラーが出ました。
【PF作成】Docker+Railsコンテナ構築時のMYSQLエラー

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

データベースを作成する前に、mysqlが起動していなかったのが原因だったようです。
以下のコマンドで解決しました。

% sudo mysql.server restart % docker-compose run web rails db:create

投稿2020/10/08 01:02

kumamin

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コンテナーを削除せず、もう一度実行すると、おそらく成功するでしょう

docker-compose run の後、MySQL の起動が間に合っていません

docker-compose run を実行後、
すぐに Docker Desktop の Dashboard などで確認してみると、
MySQL の次のログが出力される前に Rails のコマンドが実行されていることがわかるでしょう:

console

12020-10-07T12:35:28.981887Z 0 [Note] mysqld: ready for connections.

depends_on は先に依存先の Docker コンテナーを起動しますが、
内部のサービスが起動状態になっていることまでは判定しません
これを待ち受けるには、wait-for-it などを利用します

参考: Control startup and shutdown order in Compose | Docker Documentation

投稿2020/10/07 12:40

編集2020/10/07 12:42
y_shinoda

総合スコア3272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumamin

2020/10/07 13:28

ご回答ありがとうございます。 `wait-for-it`はどのように使えばよろしいのでしょうか? お送りいただいた参考サイトには `command: ["./wait-for-postgres.sh", "db", "python", "app.py"]`とありますが、 自分のアプリにどう置き換えればよいかわかりません。 Dockerを導入したいアプリではMySQLとRailsを使っているので、試しに以下の記述を追加してみたのですがエラー文は変わりませんでした。 `command: ["./wait-for-mysql.sh", "db", "ruby", "app.py"]` また、別のサイト(https://dokuo.net/rails/wait-for-it/)を参考に ターミナルに以下のようなコマンドを打ってみました。 `docker-compose run web bin/wait_for_it db:4306 -- rake db:create` すると今度は以下のようなエラーが出てきました。 ``` Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"bin/wait_for_it\": stat bin/wait_for_it: no such file or directory": unknown ```
y_shinoda

2020/10/07 13:40

wait-for-postgres.sh は 独自の Shell Script で待ち受ける例です wait-for-it の例はその上に記述されています wait-for-it は Shell Script ファイルです 何らかの方法で配置しなければ実行できません 配置する方法は様々な方法が考えられます GitHub では次の方法が支持されているようです https://github.com/vishnubob/wait-for-it/issues/57#issuecomment-497661237 僕は次のような方法で配置しています https://github.com/yukihiko-shinoda/wordpress-s3/blob/0ca4e4aaead075cfcafbe3fdbabc5a27d23a324e/Dockerfile#L11
kumamin

2020/10/08 01:01

すみません、wait-for-itを使わずに自己解決いたしました。 ご丁寧に回答していただき、誠にありがとうございました。
guest

0

host: MySQLが動作しているホスト名
なので、localhostとかipとかがくるはずなんですが、dbってなんでしったっけ?

投稿2020/10/07 12:02

firegrape

総合スコア902

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumamin

2020/10/07 13:34

ご回答ありがとうございます。 勉強不足でdbが何かをしっかりとは説明できないのですが、 Qiitaの記事(https://qiita.com/jshimazu/items/ba13ce87dfdb11e2d1d9)では、 「host名は、dockerのネットワーク内であれば、docker-composeで定義したサービス名 db で参照できる」とありました。 他の記事でも大体dbと書いてあったので、このような記述にしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問