前提・実現したいこと
作成したアプリケーションを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
回答1件
あなたの回答
tips
プレビュー