Skip to content

Dockerfileベストプラクティス2024

そのような記事があった。

これに書かれたものでは、個人的には以下の3つはよく使う。

  • ソースコードをビルドするための COPYADD は、 RUN—mount=type=bind オプションに置き換える
  • キャッシュは RUN—mount=type=cache オプションによってレイヤーを跨いだ状態で共有する
  • このとき go buildgo test は必要なモジュールしかダウンロードしないので事前に全部キャッシュしておく
  • シークレットは docker build --secret で渡す

ベースイメージの選定はコンテナサイズ最小化のためのベースイメージ再考に書いてあるが、Goなら distroless でいいと思う。

# syntax=docker/dockerfile:1
FROM gcr.io/distroless/static-debian12
WORKDIR /go/src
RUN --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 download
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=bind,target=. \
go build -C repo -o /go/bin/otel_trace

これでビルドするとき必要な値を渡す。

Terminal window
docker build --secret id=auth,env=GOAUTH .
# --secret id=GOAUTH とすれば勝手に環境変数化されるらしい

ヘルスチェックが必要なら専用の命令がある。

HEALTHCHECK --interval=5s --timeout=3s command...