golang multi-stage build でscratchを使う際にタイムゾーンを設定する方法


Dockerfile example

FROM golang:1.14.2-alpine3.11 AS builder
RUN apk --update-cache add tzdata
WORKDIR $GOPATH/src/mypackage/myapp/
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o /go/bin/myapp

FROM scratch
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo
COPY --from=builder /usr/local/go/lib/time/zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip
COPY --from=builder /go/bin/myapp /go/bin/myapp
ENV TZ=Asia/Tokyo
ENTRYPOINT ["/go/bin/myapp"]

ルートCA証明書が必要な場合は上記に加えて以下をCOPYする

COPY --from=build-stage /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt

-ldflags="-w -s"

-w DWARFシンボルテーブルを省く
DWARF生成を無効にし、ビルドプロセス中にDWARFシンボルテーブルを省く

-s シンボルテーブルとデバッグ情報を省く
実行ファイルをビルドするときに、シンボルテーブルとデバッグ情報を省く

今回はバイナリをダイエットさせるために上記のオプションを指定した
参考:
The Go Programming Language Command link

参考になった記事
GoとDockerでscratchを使うときに気をつけること