はじめに
本記事では、Dockerの「マルチステージビルド」について、サクッと試して、そのメリットを確認してみようと思います。
なお、筆者は、Dockerは初心者です。一般的な技術書に書いてあることをざっくり理解しているレベルです。
きっかけ
表紙のサブタイトルに惹かれて以下を読みました。
理想のコンテナイメージを作る Dockerfileのベストプラクティス
ソフトウェアデザイン 2023年11月号
Amazonのリンクです。興味があればぜひ。
その中で、色々と試したいことがあったのですが、まずは「マルチステージビルド」をやってみます。
前提
- golangを用いて、簡単なAPIをコンテナ化します。
- Dockerの基本的なお話は省略します。
- ベースイメージはalpine linuxを使用します。
まずはやってみる
dockerfile
- 筆者がこれまで書きがちだったdockerfile
- 一般的なDocker解説記事も、こんな書き方が多い気がします。
FROM golang:1.19.1-alpine
WORKDIR /app
COPY go.mod .
RUN go mod download
COPY . .
RUN go build -o main ./src/main.go
CMD ["./main"]
- マルチステージビルドの場合のdockerfile
# ビルド環境
FROM golang:1.19.1-alpine AS builder
WORKDIR /app
COPY go.mod .
RUN go mod download
COPY . .
# バイナリをビルド
RUN go build -o main ./src/main.go
# 実行環境
# ビルド環境と違い、golangは入っていない
FROM alpine:latest AS production
WORKDIR /app
# ビルド環境から「main」をコピー
COPY --from=builder /app/main .
# 実行
CMD ["./main"]
ビルドと結果
- そのままビルドした結果です。
REPOSITORY TAG IMAGE ID CREATED SIZE
go-api-multi latest 36c47c54cd23 3 minutes ago 14MB ⭐️マルチステージビルド
go-api latest 06b667ab680e 11 minutes ago 359MB
- マルチステージビルドのサイズ:14MB
- マルチステージビルドをしなかった場合のサイズ:359MB
- 結論:約25分の1になりました。(アプリとか、ベースイメージにより変わります)
結論
- マルチステージビルドを使用すると、コンテナのサイズが節約できますね。(約25分の1は無視できないですね。)
最後に
今回はgolangで試しましたが、nodeアプリの場合は、devDependenciesのモジュールサイズが節約できたりしそうですね。
詳細な解説については、ぜひ以下をご確認ください。Dockerについてある程度学んだ方が、もう一歩先に進むためのさまざまなテクニックがまとまっていました。
ソフトウェアデザイン 2023年11月号
Amazonのリンクです。興味があればぜひ。