LoginSignup
0
0

[Docker]マルチステージビルドをサクッと試してみる

Last updated at Posted at 2023-10-29

はじめに

本記事では、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のリンクです。興味があればぜひ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0