Cloud Native Buildpacksのrun:base-cnb に curlを入れたい
はじめに
この記事内容は古いので、こちらを参考にしてください。
Spring Boot の bootBuildImage で custom runImageを利用する - 秋の魔法使い
以下、せっかく書いたので残しておくもの
AWSのECSでサービスディスカバリを構築する場合、 タスク定義にhealth checkを設定する必要がありますが、Spring Bootの標準のrunImageには2020/10 現在 curlもwgetも入っていません 😔
ふーん、じゃあ自分でrunImage作れば (鼻ホジ) だと思うのですが、なるべく標準のImage使ってなんとかならんかなーと考えてみました。
0. full-cnbを使う
重すぎるので、残念ながら却下
1. PerlでHealthCheckする
# commandだけ抜粋 perl -MIO::Socket::INET -le '$sock = IO::Socket::INET->new(PeerAddr=>"localhost",PeerPort=>8080,Proto=>"tcp") or die $!;print $sock "GET /health HTTP/1.1\n"; print $sock "HOST: localhost:8081\n";print $sock "Connection: close\n\n";$status=<$sock>;print $status;$sock->close()' | grep 'HTTP/1.1 200 OK' || exit 1
LWPが入っていればもう少しなんとかなるけど、IO::Socketしかないので。。コマンド長すぎて辛い
2. 公式Githubを利用する
packages に curlを追加して runImageを作る。これならCodeBuildとかにも突っ込めそう。ちょっとBuildが遅そうだけど
git clone https://github.com/paketo-buildpacks/stacks.git cd stacks echo 'curl' >> packages/base/run ./scripts/create-bionic-stack.sh base
spring-boot build時には上で作ったImageをECRとか適当なところにあげてから利用する
./gradlew bootBuildImage --runImage=docker.io/myrepo/run:dev-base-cnb
3. 自分でweb-clientを用意する
curlなんか知らん!自分で書くんじゃ!とばかりにhealth.go を用意して PATHに入れる
package main import ( "flag" "fmt" "net/http" ) func main() { var u = flag.String("u", "", "url") flag.Parse() resp, _ := http.Get(*u) defer resp.Body.Close() fmt.Print(resp.Status) }
# go build CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -o health .
# Dockerfile FROM gcr.io/paketo-buildpacks/run:base-cnb COPY ./health /usr/local/bin
# healthcheck command health -u http://localhost:8080/demo | grep '^20' || exit 1
まとめ
どれもイマイチ 🤗
参考
Amazon ECS サービスディスカバリ | Amazon Web Services ブログ