説明
コンテナーのプロセスが動いていても、サービスがリクエストを処理できない場合があります。適切な状態確認がなければ、こうした障害の発見が遅れるおそれがあります。Dockerfile の HEALTHCHECK は、コンテナーを healthy または unhealthy として表示するために使えます。
unhealthy になっても Docker が自動的に再起動するわけではありません。Kubernetes ではイメージの HEALTHCHECK の代わりに、必要な liveness、readiness、startup プローブを別途構成します。
想定される影響
- プロセス状態だけを見ていると、応答しないサービスを正常稼働と判断する場合があります。
- 不適切なチェックや短すぎるタイムアウトにより、正常なサービスを異常と判断する場合があります。
対処方法
- デプロイ環境で使われる状態確認を構成し、サービスの準備状態や正常動作を確認するように設計してください。
- チェックコマンドがイメージ内で実行できることを確認し、起動時間、タイムアウト、失敗しきい値を調整してください。状態に応じたトラフィック制御と復旧動作も別途確認してください。
例
ビルドコンテキストに package.json、ロックファイル、server.js が必要です。変更後の例は正常時に /health が HTTP 200 を返す前提で、Node の組み込み HTTP モジュールを使います。
変更前
dockerfile
FROM node:22-alpine
WORKDIR /app
COPY . .
RUN npm ci
EXPOSE 3000
CMD ["node", "server.js"]
変更後
dockerfile
FROM node:22-alpine
WORKDIR /app
COPY . .
RUN npm ci
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=5s CMD node -e "require('http').get('http://127.0.0.1:3000/health', r => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))"
CMD ["node", "server.js"]
補足:
- 変更前: この Dockerfile には状態確認が宣言されていません。デプロイ環境に別途設定されたチェックも確認してください。
- 変更後: 30 秒ごとに /health を確認し、200 以外の応答や接続エラーを失敗とします。Docker はコマンドに 5 秒のタイムアウトを適用します。