教科書の虫

すぐに役に立つことは,すぐに役に立たなくなります.

HerokuにDockerコンテナをpushしてRailsアプリをデプロイする

Webアプリのデプロイ というかサーバーと会話していると無限に時間が溶けますよね.

私も今回かなりハマって悲しい思いをしたので,今日はHerokuデプロイの備忘録もかねて,手順を書いていきます.

実行時の環境

macOS High Sierra version 10.13.6
Docker version 18.06.1-ce
docker-compose version 1.22.0


Herokuデプロイの手順

Railsアプリを開発するまで

まずはリファレンス↓通りRailsアプリを構築していきましょう.

docs.docker.com


注意点として,Dockerfileの一番下に,この一行を追加しておきましょう.

CMD ["rails", "server", "-b", "0.0.0.0"]


あとはrails newしてdocker-compose upしてrails db:createしてlocalhost:3000/にアクセスすればyay!となるわけですね.


もう一つ注意点として,Gemfile

# gem 'pg', '>= 0.18', '< 2.0' 
gem 'pg', '0.20.0'  # 追加

としてビルドし直しておきましょう.

それから,rails g modelrails db:migrateしたりしてアプリ開発を楽しんでください.


Herokuにpushしていく

前準備

Herokuのアカウントを作り,heroku-cliをインストールします.


コンテナを落としておく

tmp/pids/server.pidをpushしないよう,コンテナをdownします.

>> docker-compose down
>> rm tmp/pids/server.pid


デプロイの手順

次のコマンドを順番に入力していきます.

>> heroku create
>> heroku container:push web
>> heroku addons:create heroku-postgresql:hobby-dev
>> heroku container:release web
>> heroku run rails db:migrate
>> heroku open

すると,ちゃんとHeroku上でアプリが動くかと思います.


今回のハマりどころ

pgのバージョン

obel.hatenablog.jp

↑の方のエントリに書いてあるように,pgのバージョンを変える必要があるみたいです.

DockerfileにCMD行を追加するとこ

DockerfileにおけるCMDとdocker-compose.ymlにおけるcommandには違いがあり,Dockerfileに書いた方はdockerコマンドで動作させる時に実行され,docker-compose.ymlに書いた方はdocker-composeコマンドで動作させる時に実行されるようです.

上にあげたDocker公式ページでは,docker-composeを使ってアプリを開発していくことを想定しているので,Dockerfileの方にポートを開けるコマンドがありません.

herokuではDockerfileの方のcommandを見ているのかどうかわかりませんが,これを追加したことでApplication Errorから脱出できましたので,ご参考までに.


この二つのうちどちらか,あるいはどちらも効いたようで,何とかデプロイが成功しました. このような記事をまとめてくれている人がいて助かった...


参考文献

docs.docker.com

↑ほとんどこの方の解説を参考にしましたが,この記事ではModelを使ったRailsアプリにも対応しています.

qiita.com

obel.hatenablog.jp