できない.dev

HEALTHCHECK

別名: ヘルスチェック / docker healthcheck / health check

Dockerfile の HEALTHCHECK 命令は、コンテナ内で定期的にコマンドを実行し、その終了コードでコンテナの健全性(healthy / unhealthy)を判定する仕組み。
プロセスの生存とサービスの応答は別物である点を埋める。

公開: 更新:

定義

HEALTHCHECK は、コンテナが「動いているだけ」ではなく「使える状態か」を判定するための Docker の仕組みです。
指定したコマンドをコンテナ内で定期実行し、終了コード 0 なら healthy、1 なら unhealthy として記録します。
プロセスが生きていてもアプリが応答しない状態を検出できます。

詳細

HEALTHCHECK --interval=10s --timeout=3s --start-period=30s --retries=3 \
  CMD ["curl", "-f", "http://localhost:8080/health"]

--start-period は起動が完了するまでの猶予で、この間の失敗は retries に数えません。
判定結果は docker inspectState.Health に入り、直近の出力は Health.Log から読めます。
Compose では healthcheck: に同じ内容を書け、depends_oncondition: service_healthy と組み合わせると依存先が healthy になるまで起動を待たせられます。

よくある誤解

HEALTHCHECK は unhealthy になったコンテナを自動で再起動しません。
再起動は restart ポリシーやオーケストレータ側の役割です。
また判定に使うコマンドはコンテナ内で実行されるため、イメージに curlwget が無ければ、書き方が正しくても常に unhealthy になります。

関連

常に unhealthy になる場合は Docker の HEALTHCHECK がいつも unhealthy になる、依存サービスの起動待ちについては docker compose の depends_on で起動順が待たれない を参照してください。
判定の元になる値は exit code です。

この記事は役立ちましたか?