🧰

Dockerfile for Go

2022/06/25に公開

書くたびに「どう書いてたっけ?」となるので、覚書として。

Dockerfile 全体

ポイント

マルチステージビルド

https://docs.docker.com/language/golang/build-images/#multi-stage-builds

先に go.mod, go.sum だけコピーして go mod download

...
COPY go.mod ./
COPY go.sum ./
RUN go mod download
...

distroless container image

イメージサイズが小さく、セキュアであるらしいので採用しました。
現状、使用していて困ったことは特にないです。もし何か踏み抜いた経験がある方は教えていただけると助かります 🙇

FROM gcr.io/distroless/static-debian11:latest
...

https://github.com/GoogleContainerTools/distroless

latest を使うと hadolint 君に怒られるのでアノテーションつけてます。

https://github.com/hadolint/hadolint

ルートレスコンテナ

distroless コンテナイメージには nonroot という非特権ユーザが用意されているので利用します。

...
USER nonroot
...

https://github.com/GoogleContainerTools/distroless/issues/443

おわりに

できる範囲でベストプラクティスに沿って作成したつもりではありますが、より良い Dockerfile にするためのアドバイスなどあればお願いします 🙇

参考

https://docs.docker.com/language/golang/build-images/

https://sysdig.jp/blog/dockerfile-best-practices-2/

Fivot Tech Blog

Discussion