/var/log/jsoizo

メモ帳 技術とか趣味とか

buildpackでビルドしたSpring BootコンテナのHTTPヘルスチェック

composeしてたりECS使ってるとサービスディスカバリしたりblue/greenデプロイをするための前提としてコンテナのヘルスチェックを行うことが多い。 個人的には、デプロイ成否の条件にも使えたりするので、webサーバなどコンテナでデーモンを実行するときはヘルスチェックを必ず設定するようにしている。

例えばwebサーバのヘルスチェックを行いたくて、パス /health がヘルスチェックのエンドポイントだとする。そういった場合にはdocker-composeならこのように書けば良いはずである。curlがないコンテナならwgetを使うという手もある。なければDockerfile内でインストールのコマンドを宣言すればよい。

healthcheck:
    test: [ "CMD-SHELL", "curl -k -f http:///localhost:8080/health" ]

だが、Spring Bootかつbuildpackでコンテナイメージをビルドするとイメージの中にhttpリクエストを投げるコマンドが入っていないためにデフォルトではHTTPヘルスチェックを行うことが出来ない。かつ自前でcurlをインストールするビルダーを定義するのもなかなかにだるい(もしかしたらbuildpack素人なだけで楽なのかも)

というお悩みを paketo-buildpacks/health-checker で解決できる。

以下のように BootBuildImage タスクに以下の設定を追加。

tasks.withType<BootBuildImage> {
    environment.put("BP_HEALTH_CHECKER_ENABLED", "true")
    buildpacks.set(listOf("urn:cnb:builder:paketo-buildpacks/java", "gcr.io/paketo-buildpacks/health-checker:latest"))
}

そのうえでコンテナの設定を以下のように変更する。
THC_PATHという環境変数は、このヘルスチェックを行っているのがtiny-health-checkerというbuildpackなのだが、これがいくつかの環境変数を要求してくるので追加しているものである(コマンドライン引数に渡せないのがなかなかに面倒だ..........)

environment:
    THC_PATH: "/ping"
healthcheck:
    test: [ "CMD-SHELL", "/cnb/process/health-check" ]

すると無事にHTTPヘルスチェックを行ってくれる。

とはいえ、正直メジャーではないソフトウェアを利用しているのは微妙だなと感じるので、もっといい方法を模索したい所存。