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