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

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

ただいまの
回答率

88.93%

[Docker, Rails, Nginx, MySQL, EC2]docker-compose run app rails db:createするとエラーが出る。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 206

nippledrill

score 11

開発環境において既存のRailsアプリにDockerを導入する方法(Rails、nginx、mysql)
こちらのサイトを参考に、Webサーバーにnginx、アプリケーションサーバーにpumaを使うようなDocker開発環境を構築しました。
これをAWSにデプロイするために、
無料!かつ最短?で Ruby on Rails on Docker on AWS のアプリを公開するぞ。
こちらの記事を参考に、ec2にgit cloneしてdocker-compose buildを済ませた後、タイトルのエラーが発生しました。

[sue@ip-10-0-0-239 home-study]$ docker-compose run app rails db:create
Unknown MySQL server host 'db' (-2)
Couldn't create 'myapp_development' database. Please check your configuration.
rails aborted!
Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2)
/usr/local/bundle/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect'
/usr/local/bundle/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `initialize'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/connection_adapters/mysql2_adapter.rb:22:in `new'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/connection_adapters/mysql2_adapter.rb:22:in `mysql2_connection'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:830:in `new_connection'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:874:in `checkout_new_connection'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:853:in `try_to_checkout_new_connection'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:814:in `acquire_connection'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:538:in `checkout'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:382:in `connection'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:1033:in `retrieve_connection'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/connection_handling.rb:118:in `retrieve_connection'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/connection_handling.rb:90:in `connection'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/tasks/mysql_database_tasks.rb:6:in `connection'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/tasks/mysql_database_tasks.rb:14:in `create'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/tasks/database_tasks.rb:119:in `create'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/tasks/database_tasks.rb:139:in `block in create_current'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/tasks/database_tasks.rb:316:in `block in each_current_configuration'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/tasks/database_tasks.rb:313:in `each'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/tasks/database_tasks.rb:313:in `each_current_configuration'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/tasks/database_tasks.rb:138:in `create_current'
/usr/local/bundle/gems/activerecord-5.2.4.3/lib/active_record/railties/databases.rake:29:in `block (2 levels) in <top (required)>'
/usr/local/bundle/gems/railties-5.2.4.3/lib/rails/commands/rake/rake_command.rb:23:in `block in perform'
/usr/local/bundle/gems/railties-5.2.4.3/lib/rails/commands/rake/rake_command.rb:20:in `perform'
/usr/local/bundle/gems/railties-5.2.4.3/lib/rails/command.rb:48:in `invoke'
/usr/local/bundle/gems/railties-5.2.4.3/lib/rails/commands.rb:18:in `<top (required)>'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
/usr/local/bundle/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
/usr/local/bundle/gems/activesupport-5.2.4.3/lib/active_support/dependencies.rb:291:in `block in require'
/usr/local/bundle/gems/activesupport-5.2.4.3/lib/active_support/dependencies.rb:257:in `load_dependency'
/usr/local/bundle/gems/activesupport-5.2.4.3/lib/active_support/dependencies.rb:291:in `require'
/myapp/bin/rails:9:in `<top (required)>'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/client/rails.rb:28:in `load'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/client/rails.rb:28:in `call'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/client/command.rb:7:in `call'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/client.rb:30:in `run'
/usr/local/bundle/gems/spring-2.1.0/bin/spring:49:in `<top (required)>'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `load'
/usr/local/bundle/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `<top (required)>'
/myapp/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:create
(See full trace by running task with --trace)

色々な記事を参考に進めていたのですが、一部のファイル間で参照先がずれていて矛盾が起きてしまっているのだと思います...
その他気になる点
・gitclone後にmaster.keyを紛失していることがわかり、EDITOR=vim rails credentials:editでcredentials.yml.encとmaster.keyの二つを再生成して再びgitclone→ローカルからec2へmaster.keyを渡すという操作を行っております。それも関係があるかもしれません。
・ec2内では/var/www/rails/ここにgit cloneしています。このディレクトリ順がdocker-compose.ymlとあっていないかもしれません。
・環境変数についてまだよくわかっていないのですが、docker-compose.ymlとdatabase.ymlの間でおかしなことになっているかもしれません。

恐れ入りますが、原因が分かる方教えていただけますでしょうか。
思い当たるファイル↓

FROM ruby:2.5.3

RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       libpq-dev \
                       nodejs \
                       vim
RUN apt-get update && apt-get install -y unzip && \
    CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
    wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/ && \
    unzip ~/chromedriver_linux64.zip -d ~/ && \
    rm ~/chromedriver_linux64.zip && \
    chown root:root ~/chromedriver && \
    chmod 755 ~/chromedriver && \
    mv ~/chromedriver /usr/bin/chromedriver && \
    sh -c 'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -' && \
    sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' && \
    apt-get update && apt-get install -y google-chrome-stable

RUN apt-get install -y vim

RUN mkdir /myapp

WORKDIR /myapp

ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock

RUN gem install bundler
RUN bundle install

ADD . /myapp

RUN mkdir -p tmp/sockets
RUN mkdir -p tmp/pids


docker-compose.yml

version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: user
      MYSQL_PASSWORD: 1234
      MYSQL_DATABASE: myapp_db
    volumes:
      - ./tmp/db:/var/lib/mysql/data
    ports:
      - "4306:3306"

  app:
    build: .
    command: bundle exec puma -C config/puma.rb
    volumes:
      - .:/myapp
      - public-data:/myapp/public
      - tmp-data:/myapp/tmp
      - log-data:/myapp/log

  web:
    build:
      context: containers/nginx
    volumes:
      - public-data:/myapp/public
      - tmp-data:/myapp/tmp
    ports:
      - 80:80

volumes:
  mysql-data:
  public-data:
  tmp-data:
  log-data:

database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: user
  password: 1234
  host: db

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: <%= ENV['DB_DATABASE'] %>
  adapter: mysql2
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_general_ci
  host: <%= ENV['DB_HOST'] %>
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

RDSインスタンスへの接続を想定しているようなので
app サービスのコンテナに環境変数としてキー RAILS_ENV に production を与える必要があります

参考: 第7章 ユーザー登録 - Railsチュートリアル

ちなみに、コマンド実行前に docker-compose up -d を実行すると
一見うまく動いているように見えますが、
RDS ではなく EC2 内の開発用 db サービスのコンテナに接続しているだけなので
データのバックアップ作業が煩雑になり、対障害性も低く
起動している RDS インスタンスの料金も無駄になります

環境変数の与えかた

たとえば、次のような方法があります:

1
docker-compose.yml を次のように更新します:

version: '3'
services:

---略---

  app:
    build: .
    command: bundle exec puma -C config/puma.rb
    # ↓ 追加
    environment:
      RAILS_ENV: ${RAILS_ENV}
      DB_HOST: ${DB_HOST}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
    volumes:
      - .:/myapp
      - public-data:/myapp/public
      - tmp-data:/myapp/tmp
      - log-data:/myapp/log

2
EC2 インスタンスに環境変数を設定します:

export RAILS_ENV=production
export DB_HOST=(RDS のエンドポイント)
export DB_USERNAME=(ユーザー名)
export DB_PASSWORD=(パスワード)

原因

docker-compose run コマンドは特定のサービスのためのコンテナのみを起動します

実行されているコマンドでは app サービスのみが起動し、db のサービスは起動しません:

[sue@ip-10-0-0-239 home-study]$ docker-compose run app rails db:create

そして、おそらくコンテナに環境変数として
キー RAILS_ENV に production が与えられていないため
データベース接続設定が開発用のものが読み込まれ、
db サービスが起動していないため接続に失敗します:

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/09 19:23

    回答ありがとうございます!
    docker-compose runの意味知りませんでした..ありがとうございます。
    早速docker-compose.ymlのほう修正してみました。
    解決方法のところでも書いたように、どういうわけか開発環境のほうはブラウザで確認できるところまで進んでしまいました。
    ただこれからRDSも活用したいと思っているので、きっと問題が噴出するでしょうからその時またこちらのサイトで質問させていただくかもしれません。

    キャンセル

  • 2020/07/09 19:34

    > どういうわけか開発環境のほうはブラウザで確認できるところまで進んでしまいました。

    これは、回答欄の次の箇所で説明していることが原因です:

    > 一見うまく動いているように見えますが、
    > RDS ではなく EC2 内の開発用 db サービスのコンテナに接続しているだけなので

    ただし、EC2 を本番環境としてではなく、開発環境としてお使いで
    データベースのバックアップなどの必要もなければ、
    RDS でなく db サービスのコンテナでも構わないかもしれません

    その場合は RDS を停止させておくと無料枠を消費せずにすみます

    キャンセル

  • 2020/07/13 15:39

    忙しくて返信が遅れ申し訳ありません。
    現在もろもろの設定を済ませて、RDSに接続できたかな?という状態なのですが、
    どうすればRDSと接続していることを確認できるのでしょうか。
    初歩的な質問ですが教えて頂けると嬉しいです。

    キャンセル

  • 2020/07/13 16:16

    ひとつは、
    db サービスを落とした状態でアプリケーションがデータを保存できることを確認する方法です
    さらに厳密に確認が必要であれば、
    アプリケーションから選択・登録・更新・削除して、
    データベースを直接確認した結果と比較することです

    これ以上は長くなるので、
    AWS RDS MySQL のタグを付与した新しい質問を作成することをお奨めします

    キャンセル

check解決した方法

0

参考にしていた記事をもう一度よく確認して、以下の3つの手順を行ったところ無事ブラウザで確認できました。
①database.ymlの修正
②先にdocker-compose up -dを実行
③docker-compose run app rails db:createではなくdocker-compose exec app rails db:createで実行

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: user
  password: 1234
  host: db


username: <%= ENV.fetch('MYSQL_USER') { 'root' } %>
password: <%= ENV.fetch('MYSQL_PASSWORD') { 'password' } %>に変更しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る