Goで書いたアプリのDockerイメージをできるだけ小さくしようとして、 multi stage buildにそってやったら、timezone情報が取れなくてpanicが発生して(‘A`)になったので、その対応策について。

コード全体はこちら。

Panic になるコード

普通にmulti stage buildでalpineにビルド済イメージを COPY して実行すると、下記コードはpanicする。

jst, err := time.LoadLocation("Asia/Tokyo")
if err != nil {
    panic(err)
}

alpineは /etc/localtime がないため。

panic: open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory

goroutine 1 [running]:
main.main()
        /go/src/github.com/takecy/tz/main.go:11 +0x22b
make: *** [run_alpine] Error 2

対応

対応は難しいことはなく、単に tzdata を入れればよい。

RUN apk --no-cache add tzdata

全体の例

FROM golang:1.9.3-alpine AS build

COPY . $GOPATH/src/github.com/takecy/tz
WORKDIR $GOPATH/src/github.com/takecy/tz

RUN go build -o tz .\
 && mv tz /usr/local/bin/


FROM alpine:3.6

RUN apk --no-cache add tzdata

COPY --from=build /usr/local/bin/tz /usr/local/bin/

CMD ["tz"]
takecy/tz-sample