どうもてぃです。
一ヶ月ほど前に僕もパパになり、可愛い娘の寝顔を見ながら出勤する毎日を過ごしております。
天使すぎてホント癒やされる。
それはさておき、今回はherokuへコンテナデプロイした際に少しハマったので、同じ現象に悩まれてる方へ向けて記事を書きたいと思います。
heroku container
今回始めてheroku containerを使用してみたんですが、めちゃくちゃ簡単でした。
プロジェクトをDockerで作成しているなら是非やってみてください。
ただ、気をつけていないとハマる部分は割とあります。
以下デプロイ手順参考。
個人的にherokuとgoogleはリファレンスが最強だと思ってます。
そんなに難しい英語も書いてないですしね。
はまった現象
heroku containerのデプロイ時に気をつけないといけないのが、デプロイしたいコンテナ以外のコンテナが動いている場合は壊すか止めるかしないとアプリケーションクラッシュの原因になることです。
僕は開発が終わったら毎回コンテナを潰してるので、 docker ps -a
で出てきたものは全て削除してます。
総削除は以下のコマンド。
$ docker rm `docker ps -a -q`
最近はdockerのCUIも増えてきてるのでそれを使うのも有りかもですね。
ちょーっと重いですがvimライクに操作できるので以下を使ってます。
コンテナ削除後、デプロイ手順を踏んで普通にデプロイ。
$ 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デプロイの便利さはやめられないです。