buildahでマルチステージビルド

はじめに

buildah でマルチステージビルドができるか、確認する。

環境

  • buildah version 1.23.1
  • crictl version v1.28.0

構築、確認

最初に、マルチステージビルドありの状態で実施する。 テスト用のアプリケーションをcloneする

$ git clone https://github.com/gothinkster/golang-gin-realworld-example-app
$ cd golang-gin-realworld-example-app

Dockerfileを作成する。

$ cat > Dockerfile << EOF
# syntax=docker/dockerfile:1

# 実行ファイル作成用のビルドステージ
FROM golang:1.20-alpine3.17 AS builder

# SQLite 接続に使用するためインストール
RUN apk update && apk add --no-cache gcc musl-dev sqlite-dev

WORKDIR /app

COPY go.mod go.sum hello.go doc.go ./
COPY common ./common
COPY users ./users
COPY articles ./articles

RUN go mod download

RUN GOOS=linux go build -o ./realworld

# 最終的な image のビルドステージ
FROM alpine:3.17

WORKDIR /app

# ビルド用の image から実行ファイルをコピー
COPY --from=builder /app/realworld .

EXPOSE 8080

CMD [ "./realworld" ]
EOF

ビルドする。

$ sudo buildah bud -t multi-realworld-app -f ./Dockerfile

$ sudo crictl images
IMAGE                                                                    TAG                 IMAGE ID            SIZE
localhost/multi-realworld-app                                            latest              0cac5a64c9cfb       26.5MB

次に、マルチステージビルドをしない場合と比較する。

$ cat > Dockerfile_nomulti << EOF
# syntax=docker/dockerfile:1
FROM golang:1.20-alpine3.17 AS builder

RUN apk update && apk add --no-cache gcc musl-dev sqlite-dev

WORKDIR /app

COPY go.mod go.sum hello.go doc.go ./
COPY common ./common
COPY users ./users
COPY articles ./articles

RUN go mod download

RUN GOOS=linux go build -o ./realworld

EXPOSE 8080

CMD [ "./realworld" ]
EOF

$ sudo buildah bud -t nomulti-realworld-app -f ./Dockerfile_nomulti
$ sudo crictl images |grep multi
localhost/multi-realworld-app                                            latest              0cac5a64c9cfb       26.5MB
localhost/nomulti-realworld-app                                          latest              58a0758328757       749MB

マルチステージビルドなしの場合と比較して、大きく軽量化できていることを確認した。

参考

zenn.dev

github.com