はじめに
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
マルチステージビルドなしの場合と比較して、大きく軽量化できていることを確認した。