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

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

新規登録して質問してみよう
ただいま回答率
85.50%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Docker

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

Q&A

解決済

1回答

2506閲覧

docker環境下で作ったRailsアプリをherokuにデプロイし、herokuを開くとMysql2::Error::ConnectionErrorを返される

zyno

総合スコア41

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Docker

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

0グッド

0クリップ

投稿2020/01/23 12:43

編集2020/02/01 14:50

前提・実現したいこと

作成したアプリケーションをherokuでデプロイし、正常に作動させたい。

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

docker環境下で作ったRailsアプリをherokuに以下のような命令でデプロイし、herokuを開くと「We're sorry, but something went wrong.」と返されました。

$ git push heroku $ heroku pg:reset DATABASE $ heroku run rails db:migrate $ heroku run rails db:seed $ heroku restart

heroku logsで確認したところ、

Mysql2::Error::ConnectionError (Unknown MySQL server host 'db' (0))

と返されました。

該当のソースコード

2020-01-23T09:45:41.310424+00:00 app[web.1]: I, [2020-01-23T09:45:41.310325 #4] INFO -- : [c20c31e8-8549-4372-a4e3-e1dad204f7ab] Started GET "/users/sign_in" for at 2020-01-23 09:45:41 +0000 2020-01-23T09:45:41.311642+00:00 app[web.1]: I, [2020-01-23T09:45:41.311577 #4] INFO -- : [c20c31e8-8549-4372-a4e3-e1dad204f7ab] Processing by Users::SessionsController#new as HTML 2020-01-23T09:45:41.331884+00:00 app[web.1]: I, [2020-01-23T09:45:41.331758 #4] INFO -- : [c20c31e8-8549-4372-a4e3-e1dad204f7ab] Completed 500 Internal Server Error in 20ms 2020-01-23T09:45:41.333343+00:00 app[web.1]: F, [2020-01-23T09:45:41.333249 #4] FATAL -- : [c20c31e8-8549-4372-a4e3-e1dad204f7ab] 2020-01-23T09:45:41.333445+00:00 app[web.1]: F, [2020-01-23T09:45:41.333392 #4] FATAL -- : [c20c31e8-8549-4372-a4e3-e1dad204f7ab] Mysql2::Error::ConnectionError (Unknown MySQL server host 'db' (0)): 2020-01-23T09:45:41.333532+00:00 app[web.1]: F, [2020-01-23T09:45:41.333468 #4] FATAL -- : [c20c31e8-8549-4372-a4e3-e1dad204f7ab] 2020-01-23T09:45:41.333690+00:00 app[web.1]: F, [2020-01-23T09:45:41.333608 #4] FATAL -- : [c20c31e8-8549-4372-a4e3-e1dad204f7ab] vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect'

試したこと

######①Mysql2::Error::ConnectionError (Unknown MySQL server host 'db' (0)) で検索
https://teratail.com/questions/215785

から、database.ymlに原因があるのではないかと考え、productionに設定してあるusernameやpasswordをコメントアウトした。しかし、うまく行かない。

#コメントアウト後 default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: <%= ENV['MYSQL_ROOT_PASSWORD'] %> host: db development: <<: *default database: app_development production: <<: *default database: app_production username: #app password: #<%= ENV['MYSQL_ROOT_PASSWORD'] %>

######②dockerをdevelopment環境で作っていた時もMysql2::Error::ConnectionErrorで動かなかったことに気づく
→そこから、docker環境下ではherokuへのデプロイのやり方が違うのではないかということに気づく。

######③「docker heroku デプロイ」で検索した。

「Unknown MySQL server host 'db' (0)を消したい」から、docker環境下でのherokuへのデプロイのやり方が載っていたので、それを実行してみた。

# herokuのコンテナレジストリにログイン heroku container:login # 新しいappを作成 heroku create # イメージを作成してコンテナレジストリにpush heroku container:push web # postgresqlアドオンの無料プランを追加 heroku addons:create heroku-postgresql:hobby-dev # DBセットアップ heroku run rails db:migrate # イメージをherokuへデプロイ heroku container:release web # 実際にアクセスして/usersを確認してみる heroku open

→実行した結果、heroku container:push webの段階で「No images to push」と返される。

$ heroku container:push web ▸ No images to push

######④なぜNo images to pushと返されるのかを調べた。

DockerでRailsの環境構築してHerokuへデプロイする

から、「No images to push」はアプリケーション直下にあるDockerfileじゃないとherokuにpushできませんよということらしい。

######⑤今回Dockerfileを以下のディレクトリ構成図のようにrails nginx dbとディレクトリを分ける形で設置しているが、それだとアプリケーション直下にないからだめらしい。ディレクトリを分けてDockerfile入れている場合にイメージをpushするにはどうすればいいかを考えた。

Heroku で Docker を使う場合の諸注意
Heroku Container Registry & Runtime とは(Heroku Dev Center の私家訳)

*ディレクトリ構成図

├── docker │ ├── mysql │ │ ├── Dockerfile │ │ ├── charset.cnf │ │ └── password.yml │ ├── nginx │ │ ├── Dockerfile │ │ ├── default.conf │ │ └── nginx.conf │ └── rails │ ├── Dockerfile │ └── unicorn.rb

######⑥「Heroku で Docker を使う場合の諸注意」の中見出し、「複数のイメージを push するには」から、Dockerfileそれぞれの拡張子をweb db middleに変えてheroku container:push web db middle --recursiveを実行してみた。

=== Building web (/Users/[username]/code/chiki/docker/rails/Dockerfile.web) Sending build context to Docker daemon 3.072kB Step 1/9 : FROM ruby:2.6.3 ---> 8fe6e1f7b421 Step 2/9 : RUN apt-get update -qq && apt-get install -y apt-utils build-essential libpq-dev nodejs default-mysql-client ---> Using cache ---> ed29235900e8 Step 3/9 : RUN mkdir /app ---> Using cache ---> e0eec992733a Step 4/9 : WORKDIR /app ---> Using cache ---> 785bafe56a78 Step 5/9 : ADD Gemfile /app/Gemfile ADD failed: stat /var/lib/docker/tmp/docker-builder070804113/Gemfile: no such file or directory ▸ Error: docker build exited with Error: 1

Dockerfileは動いたが、なぜかファイルがないと言われる。訳が分からなくなってきたので質問を投げているといった形です。2週間くらい詰まりっぱなしでお手上げです。小さい違和感でもいいので、回答いただけると助かります。

補足情報(FW/ツールのバージョンなど)

バックエンド:Ruby(Ruby on Rails)
フロントエンド:BootStrap
Web:NginX
DB:MySQL
Dockerを用いてRailsとNginXとMySQLを仮想化しています

docker

1#docker-compose.yml 2version: "2" 3services: 4 app: 5 build: 6 context: . 7 dockerfile: ./docker/rails/Dockerfile 8 command: bundle exec unicorn -p 3000 -c /app/config/unicorn.rb 9 # command: bundle exec rails s -p 3000 -b '0.0.0.0' 10 ports: 11 - "3000:3000" 12 volumes: 13 - /var/tmp 14 - .:/app 15 - bundle:/bundle 16 depends_on: 17 - db 18 extends: 19 file: ./docker/mysql/password.yml 20 service: password 21 stdin_open: true 22 tty: true 23 24 db: 25 build: 26 context: . 27 dockerfile: ./docker/mysql/Dockerfile 28 ports: 29 - "3306:3306" 30 volumes: 31 - db_data:/var/lib/mysql 32 extends: 33 file: ./docker/mysql/password.yml 34 service: password 35 36volumes: 37 db_data: 38 bundle: 39 driver: local
#mysql/Dockerfile FROM mysql:5.7 RUN apt-get update && \ apt-get install -y apt-utils \ locales && \ rm -rf /var/lib/apt/lists/* && \ echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \ locale-gen ja_JP.UTF-8 ENV LC_ALL ja_JP.UTF-8 ADD ./docker/mysql/charset.cnf /etc/mysql/conf.d/charset.cnf
#nginx/Dockerfile FROM mysql:5.7 FROM nginx:1.16 RUN apt-get update && \ apt-get install -y apt-utils \ locales && \ echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \ locale-gen ja_JP.UTF-8 ENV LC_ALL ja_JP.UTF-8 ADD ./docker/nginx/nginx.conf /etc/nginx/nginx.conf ADD ./docker/nginx/default.conf /etc/nginx/conf.d/default.conf
#rails/Dockerfile FROM ruby:2.6.3 RUN apt-get update -qq && \ apt-get install -y apt-utils \ build-essential \ libpq-dev \ nodejs \ default-mysql-client RUN mkdir /app WORKDIR /app ADD Gemfile /app/Gemfile ADD Gemfile.lock /app/Gemfile.lock RUN bundle install -j4 ADD . /app EXPOSE 3000

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

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

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

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

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

final_mikan

2020/01/27 05:27 編集

herokuはあまりよくわかりませんが、 Dockerfileとdocker-compose.ymlを見せてください
guest

回答1

0

ベストアンサー

もう解決してるかもしれませんが、一応。
私もそのエラーでかなり苦戦したんですが、なんとか今はHeroku上でデプロイできてます。
解決できた方法はMySQLのデータベースを作ったことです。

$docker-compose run web rails db:create

ただし&docker-compose upでコンテナが立ち上がっている状態でないと、MySQLへ接続できないとのエラーが出てしまいます。手順としてはコンテナを立ち上げてから上記コマンドでデータベースを作ってという感じで行けると思いますが、どうでしょうか?
ちなみにHeroku上では、DBは自動でcreateしてくれますのでheroku run rails db:createコマンドは必要ないです。

投稿2020/04/03 08:22

ShinjiAsai

総合スコア51

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問