HerokuにDockerコンテナをpushしてRailsアプリをデプロイする
8時間にわたるデプロイが完了した
— あらい (@txtb0kwrm) 2018年9月6日
なんでherokuなのにこんなに時間かかるんだ笑
Webアプリのデプロイ というかサーバーと会話していると無限に時間が溶けますよね.
私も今回かなりハマって悲しい思いをしたので,今日はHerokuデプロイの備忘録もかねて,手順を書いていきます.
実行時の環境
macOS High Sierra version 10.13.6 Docker version 18.06.1-ce docker-compose version 1.22.0
Herokuデプロイの手順
Railsアプリを開発するまで
まずはリファレンス↓通りRailsアプリを構築していきましょう.
注意点として,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 model
,rails 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のバージョン
↑の方のエントリに書いてあるように,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から脱出できましたので,ご参考までに.
この二つのうちどちらか,あるいはどちらも効いたようで,何とかデプロイが成功しました. このような記事をまとめてくれている人がいて助かった...
参考文献
↑ほとんどこの方の解説を参考にしましたが,この記事ではModelを使ったRailsアプリにも対応しています.