참고: 도커 Docs
이미지 제작에서 가장 어려운 점 중 하나는 배포하기 쉽게 이미지 사이즈를 작게 관리하는 것입니다.
보통 개발에 사용할 Dockerfile을 한 개만 갖는 것이 매우 일반적이지만
Multi-Stage Builds 전에는 응용 프로그램을 빌드하는 데 필요한 모든 것을 포함한 환경(개발 환경)과 가볍게 응용 프로그램 사용할 환경(운영 환경)을 나눠 빌드하기 위해서 두 개의 Dockerfile을 사용했었습니다. 이 방법을 builder pattern이라고 합니다.
하지만, 두 개의 Dockerfile을 다뤄야 되는 builder pattern은 이상적이지 않습니다.
Multi-Stage Builds에서는 Dockerfile에서 여러 FROM문을 사용합니다.
<예시>
FROM golang:1.16
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go ./
RUN CGO_ENABLED=0 go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app ./
CMD ["./app"]
위와 같은 경우 --from=0
는 첫번째 FROM절이 있는 Stage를 뜻 합니다.
FROM문에서 FROM <이미지> AS <Stage 이름>
으로 설정해서 이름으로 사용할 수 도 있습니다.
Multi-Stage Builds는 Docker 엔진 17.05에서 도입되었습니다.