[検証]DockerのMulti-stage builds

背景

DockerImageのMulti-stage buildsをするとサイズがどのくらい落ちるか気になったので、検証しました。

対象としている人

  • Docker学習中の人
  • Docker Imageを実装している人

実験結果

一目瞭然ですね。 まさかの約370MBの違いもありました。

Goのベースイメージを採用したDockerImage golang:1.19をベースイメージとして使っています。 image.png

Multi-stage buildsを採用したDockerImage scratchをベースイメージとして使っています。 image.png

それぞれのDockerImage

Goのベースイメージを採用したDockerImage

FROM golang:1.19
WORKDIR /usr/src/app
COPY . ./
RUN go mod download && go mod verify
EXPOSE 8000
CMD ["go", "run", "./cmd/main.go"]

Multi-stage buildsを採用したDockerImage

# syntax=docker/dockerfile:1
FROM golang:1.19 as builder
WORKDIR /usr/src/app
COPY ./backend/go.mod ./backend/go.sum ./
RUN go mod download && go mod verify
COPY ./backend .
RUN CGO_ENABLED=0 go build -o binary ./cmd/main.go
FROM scratch
WORKDIR /usr/src/app
# scratch doesn't have timezone.
COPY --from=builder /usr/share/zoneinfo/Asia/Tokyo /usr/share/zoneinfo/Asia/Tokyo
COPY --from=builder /usr/src/app/binary /usr/src/app/binary
COPY ./backend/configs.yaml .
EXPOSE 8080
CMD ["./binary"]