Dockerfileベストプラクティス2024
そのような記事があった。
これに書かれたものでは、個人的には以下の3つはよく使う。
- ソースコードをビルドするための COPY や ADD は、 RUN の —mount=type=bind オプションに置き換える
- キャッシュは RUN の —mount=type=cache オプションによってレイヤーを跨いだ状態で共有する
- このとき go build や go test は必要なモジュールしかダウンロードしないので事前に全部キャッシュしておく
- シークレットは
docker build --secretで渡す
ベースイメージの選定はコンテナサイズ最小化のためのベースイメージ再考に書いてあるが、Goなら distroless でいいと思う。
# syntax=docker/dockerfile:1
FROM gcr.io/distroless/static-debian12WORKDIR /go/srcRUN --mount=type=cache,target=/go/pkg/mod,sharing=locked \ --mount=type=bind,source=go.mod,target=go.mod \ --mount=type=bind,source=go.sum,target=go.sum \ --mount=type=secret,id=auth \ GOAUTH=$(cat /run/secrets/auth) \ go mod downloadRUN --mount=type=cache,target=/go/pkg/mod \ --mount=type=bind,target=. \ go build -C repo -o /go/bin/otel_traceこれでビルドするとき必要な値を渡す。
docker build --secret id=auth,env=GOAUTH .
# --secret id=GOAUTH とすれば勝手に環境変数化されるらしいヘルスチェックが必要なら専用の命令がある。
HEALTHCHECK --interval=5s --timeout=3s command...