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