以前まで成功していたのに...
BuildとPushは成功するが、Cloud Buildのdeployのタイミングで以下のログメッセージが表示された。
"Deploy": ERROR: (gcloud.run.services.update) Revision 'サービス名' is not ready and cannot serve traffic. The user-provided container failed to start and listen on the port defined provided by the PORT=3000 environment variable. Logs for this revision might contain more information.
コンテナが指定したポートをリッスンできなかったらしい...
が、調査していると、ポートをリッスンできていないからこのログが表示されるとは限らないことがわかった。
前提
- Githubのmainブランチにプッシュ/マージすると、Cloud Buildが実行されるように設定している
- Cloud BuildにはDockerfileを使用している
原因
Dockerfileの書き方に原因があることがわかった。
# 失敗するパターン
CMD ["HOSTNAME='0.0.0.0'", "node", "server.js"]
# うまくいくパターン
CMD HOSTNAME='0.0.0.0' node server.js
そもそも、うまくいくパターンでDockerfileを書いていたが、Dockerのバージョンアップがあったのだろうかローカルで警告が出るようになったので編集を行った。
(ローカルマシンのDockerバージョンは27.1.1)
1 warning found (use docker --debug to expand):
- JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals (line 54)
この警告については参考の項にあるページを参照すると、ENTRYPOINTコマンドとCMDコマンドで起こる警告であることがわかった。
ということで、Dockerfileを前の状態に戻しておくことにする。
# ローカルでは警告が出るが、deployできていないほうがマズいので...
CMD HOSTNAME='0.0.0.0' node server.js
最後に
とりあえずdeployできる状態に戻しましたが、マズい書き方をしているようであれば指摘していただけるとありがたいです。
参考