Atsushi2022の日記

データエンジニアリングに関連する記事を投稿してます

Docker マルチステージビルド

Multi-stage builds

要は複数のFROMを使用したビルドのこと。各FROM句により新しいビルドステージが始まる。

COPYにより、前のステージから新しいステージに必要なビルド作成物(アーティファクト、要はファイルのこと)のみコピーすることで、最終イメージサイズを小さくすることができる。

以下の例では2つ目のFROM句でscratchイメージという空のイメージを使用し、COPY句で/bin/helloファイルのみコピーすることで、/bin/helloバイナリのみのイメージができる。

FROM golang:1.21 AS build
WORKDIR /src
COPY <<EOF /src/main.go
package main

import "fmt"

func main() {
  fmt.Println("hello, world")
}
EOF
RUN go build -o /bin/hello ./main.go

FROM scratch
COPY --from=build /bin/hello /bin/hello
CMD ["/bin/hello"]

1つ目のFROM句でASにより、ステージにbuildという名前をつけている。そして、2つ目のステージでCOPY --from=buildとすることで、buildというステージからファイルをコピーしている。

次のようにFROM句で以前のステージを指定することもできる。

# syntax=docker/dockerfile:1

FROM alpine:latest AS builder
RUN apk --no-cache add build-base

FROM builder AS build1
COPY source1.cpp source.cpp
RUN g++ -o /binary source.cpp

FROM builder AS build2
COPY source2.cpp source.cpp
RUN g++ -o /binary source.cpp

参考

Multi-stage builds