HerokuにDockerコンテナ(Webサーバー)をデプロイした際に、"No web processes running"エラーが発生してしまいました。原因や解決方法について調べたので、内容をメモします。
事象
HerokuにDockerコンテナ(Expressを利用したWebサーバー)をデプロイした後、ページを開いてみるとApplication errorが発生しておりました。
サーバーログをheroku logs --tail
で確認してみると、以下のように"No web processes running"とのエラーが出力されておりました。
2020-12-06T06:05:22.736018+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/" host=jiko-album-artwork-backend.herokuapp.com request_id=33285f21-ed78-4733-b3d4-1214031f1daa fwd="118.158.162.21" dyno= connect= service= status=503 bytes= protocol=https
2020-12-06T06:05:23.397411+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=jiko-album-artwork-backend.herokuapp.com request_id=39ff37fc-42c9-4f68-aedf-19c1e3cfcc5c fwd="118.158.162.21" dyno= connect= service= status=503 bytes= protocol=https
原因
どうやらDockerコンテナをビルドする際に指定したプロセス名に問題があったようです。
私がデプロイに使用したコマンドは次の通りです。
docker build -t registry.heroku.com/$HEROKU_BACKEND_APP_NAME/express -f ./express/Dockerfile.express ./express;
docker push registry.heroku.com/$HEROKU_BACKEND_APP_NAME/express;
heroku container:release express --app $HEROKU_BACKEND_APP_NAME
こちらの記事を読んだ際、Dockerコンテナをデプロイするにあたり、<process-type>
は任意の文字列でいいのかなと思っていたので、”express”を指定しておりました。が、どうやらWebサーバーとして動かすコンテナは”web”と指定しないと動かないようです。
こちらの記事を読んだ際、Dockerコンテナをデプロイするにあたり、<process-type>
は任意の文字列でいいのかなと思っていたので、"express"と指定しておりました。が、どうやらWebサーバーとして動かすコンテナは"web"と指定しないと動かないようです。
よくよく調べてみると公式ドキュメントの別のページに、Herokuのプロセスタイプは"Web", "Worker", "One-off"の3種類があり、その中でも"Web"プロセスのみが外部から(HerokuのRouterを経由)のHTTPトラフィックを受信できる、と記載されてますね。つまり、"Web"プロセスがなければ、ページにアクセスしてもトラフィックがデプロイしたWebサーバーに届かずにエラーになるようです。
解決方法
よって、<process-type>
を以下のように"web"で指定することで無事ページが開けるようになりました!
docker build -t registry.heroku.com/$HEROKU_BACKEND_APP_NAME/web -f ./express/Dockerfile.express ./express;
docker push registry.heroku.com/$HEROKU_BACKEND_APP_NAME/web;
heroku container:release web --app $HEROKU_BACKEND_APP_NAME
ちなみに、私は上記を実行した後、以下のコマンドも実行してWebプロセスのDynoを手動で立ちあげる必要がありました。
heroku ps:scale web=1
上記は"web"のDynoを1というスケールで実行するコマンドです。Dyno[1]の数を増やすことでスケールアウトできます。