Rubyと筋肉とギターとわたし

筋トレが仕事です

【Rails】heroku containerをリリース時にアプリがクラッシュする

f:id:rdwbocungelt5:20181009115813j:plain

どうもてぃです。

一ヶ月ほど前に僕もパパになり、可愛い娘の寝顔を見ながら出勤する毎日を過ごしております。

天使すぎてホント癒やされる。

それはさておき、今回はherokuへコンテナデプロイした際に少しハマったので、同じ現象に悩まれてる方へ向けて記事を書きたいと思います。

heroku container

今回始めてheroku containerを使用してみたんですが、めちゃくちゃ簡単でした。

プロジェクトをDockerで作成しているなら是非やってみてください。

ただ、気をつけていないとハマる部分は割とあります。

以下デプロイ手順参考。

devcenter.heroku.com

個人的にherokuとgoogleはリファレンスが最強だと思ってます。

そんなに難しい英語も書いてないですしね。

はまった現象

heroku containerのデプロイ時に気をつけないといけないのが、デプロイしたいコンテナ以外のコンテナが動いている場合は壊すか止めるかしないとアプリケーションクラッシュの原因になることです。

僕は開発が終わったら毎回コンテナを潰してるので、 docker ps -a で出てきたものは全て削除してます。

総削除は以下のコマンド。

$ docker rm `docker ps -a -q`

最近はdockerのCUIも増えてきてるのでそれを使うのも有りかもですね。

ちょーっと重いですがvimライクに操作できるので以下を使ってます。

github.com

コンテナ削除後、デプロイ手順を踏んで普通にデプロイ。

$ heroku container:push web

$ heroku container:release web

大抵はこれで上手く行きますが、アプリケーションを開いたところクラッシュしてました。

以下がログ(heroku logs --tail

2019-09-04T01:35:25.823858+00:00 heroku[web.1]: Starting process with command `rails server -b 0.0.0.0`
2019-09-04T01:35:31.697033+00:00 heroku[web.1]: State changed from starting to crashed
2019-09-04T01:35:31.606898+00:00 app[web.1]: A server is already running. Check /myapp/tmp/pids/server.pid.
2019-09-04T01:35:31.608944+00:00 app[web.1]: => Booting Puma
2019-09-04T01:35:31.608946+00:00 app[web.1]: => Rails 5.2.3 application starting in production
2019-09-04T01:35:31.608948+00:00 app[web.1]: => Run `rails server -h` for more startup options
2019-09-04T01:35:31.608949+00:00 app[web.1]: Exiting
2019-09-04T01:35:31.684704+00:00 heroku[web.1]: Process exited with status 1
2019-09-04T01:35:33.527454+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/robots.txt" host=line-bot.herokuapp.com request_id=f2475bec-d670-4f3b-9395-407e57a997c5 fwd="103.5.142.233" dyno= connect= service= status=503 bytes= protocol=https
2019-09-04T01:35:34.134860+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=line-bot.herokuapp.com request_id=d61341cf-9cc6-4290-9ece-55689779e7ef fwd="103.5.142.233" dyno= connect= service= status=503 bytes= protocol=https
2019-09-04T01:37:22.870909+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=line-bot.herokuapp.com request_id=9deb4679-3509-4dbd-bd45-3722609ec387 fwd="103.5.142.233" dyno= connect= service= status=503 bytes= protocol=https
2019-09-04T01:37:25.542657+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=line-bot.herokuapp.com request_id=72fa644f-8a98-4e96-a20b-82e01de4b659 fwd="103.5.142.233" dyno= connect= service= status=503 bytes= protocol=https
2019-09-04T01:37:28.998503+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=line-bot.herokuapp.com request_id=dd9d8c5e-7f57-4adf-816a-e68782ca8b83 fwd="103.5.142.233" dyno= connect= service= status=503 bytes= protocol=https
2019-09-04T01:37:29.463016+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=line-bot.herokuapp.com request_id=b0201b8e-efad-41f6-890c-42c4726c3922 fwd="103.5.142.233" dyno= connect= service= status=503 bytes= protocol=https

マイグレーションもやったし、DBもインスタンスも有料化してるし。。。

もしかしたらなんかエラーが出てるのにそのままデプロイしちゃったかも?とおもってローカルで確認してみたけどそんなこと全く無い。。。

原因不明でした。

よくあるエラーと同じだった

今回の問題はDockerじゃなくてもローカルでも起きる問題が、Dockerコンテナをデプロイしたがゆえに発生した問題でもありました。

どういうことかというと、ローカルで普通に開発している場合(Dockerの有無にかかわらず)、Railsサーバーを落とした際に何かの不具合で tmp/pids/server.pid が残っていると Process exited with status 1 が発生して起動できないことがあります。

これがまさに今回の原因で、コンテナをデプロイする際に、ローカルプロジェクトに tmp/pids/server.pid が残っていると一緒にherokuへデプロイされちゃうと。

エラーメッセージがまさにそれを物語っていて

2019-09-04T01:35:25.823858+00:00 heroku[web.1]: Starting process with command `rails server -b 0.0.0.0`
2019-09-04T01:35:31.697033+00:00 heroku[web.1]: State changed from starting to crashed
2019-09-04T01:35:31.606898+00:00 app[web.1]: A server is already running. Check /myapp/tmp/pids/server.pid.
2019-09-04T01:35:31.608944+00:00 app[web.1]: => Booting Puma
2019-09-04T01:35:31.608946+00:00 app[web.1]: => Rails 5.2.3 application starting in production
2019-09-04T01:35:31.608948+00:00 app[web.1]: => Run `rails server -h` for more startup options
2019-09-04T01:35:31.608949+00:00 app[web.1]: Exiting
2019-09-04T01:35:31.684704+00:00 heroku[web.1]: Process exited with status 1

A server is already running. Check /myapp/tmp/pids/server.pid. で、デプロイはできているけど、processが既にあるんすわ〜ってherokuが認識してしまっていたということですね。

解決策

とても簡単で

$ rm tmp/pids/server.pid

$ heroku container:push web

$ heroku container:release web

これで解決です。

はまるところはあるんですが、一度出来てしまえばcontainerデプロイの便利さはやめられないです。