すきま風

勉強したことのメモとか

Cloud Native Buildpacksのrun:base-cnb に curlを入れたい

はじめに

この記事内容は古いので、こちらを参考にしてください。

Spring Boot の bootBuildImage で custom runImageを利用する - 秋の魔法使い

以下、せっかく書いたので残しておくもの

AWSのECSでサービスディスカバリを構築する場合、 タスク定義にhealth checkを設定する必要がありますが、Spring Bootの標準のrunImageには2020/10 現在 curlwgetも入っていません 😔
ふーん、じゃあ自分でrunImage作れば (鼻ホジ) だと思うのですが、なるべく標準のImage使ってなんとかならんかなーと考えてみました。

0. full-cnbを使う

重すぎるので、残念ながら却下

1. PerlでHealthCheckする

Perlが入っていたので、curlの代わりに利用する案

# 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 ブログ

AWS::ECS::TaskDefinition HealthCheck - AWS CloudFormation

GitHub - paketo-buildpacks/stacks: stacks