본문으로 건너뛰기

멀티스테이지 빌드로 용량최적화


도커빌드이미지는 용량이 무척 크다
그래서 alpine 을 많이 쓰는데 그래도 300메가 정도는 된다.
코드가 살짝 바뀌었을 뿐인데 매번 모든 의존성 라이브러리를 모두 포함시켜 빌드 한다면
무척이나 큰 결과물이 매번 생성되고, 시간, 용량에서 손해를 보게 된다.
이러한 부분을 해결하기 위해 멀티스테이지 빌드를 사용한다.

  • 하나의 Dockerfile 에서 빌드 이미지와 실행 이미지로 분리한다.

여러 예제로 보자.

FROM golang:1.7.3 AS builder
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 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]

윗쪽 절반이 빌드이미지 / 아래쪽 절반이 실행 이미지
FROM golang:1.7.3 AS builder <- 이 부분에서 builder 이란 별칭을 사용
밑에쪽에서는 COPY --from=별칭 식으로 사용한 것을 알 수 있다.


다른 예제

# 1. Build Image
FROM golang:1.13 AS builder

# Install dependencies
WORKDIR /go/src/github.com/asashiho/dockertext-greet
RUN go get -d -v github.com/urfave/cli

# Build modules
COPY main.go .
RUN GOOS=linux go build -a -o greet .

# ------------------------------
# 2. Production Image
FROM busybox
WORKDIR /opt/greet/bin

# Deploy modules
COPY --from=builder /go/src/github.com/asashiho/dockertext-greet/ .
ENTRYPOINT ["./greet"]

이것도 다른 예제

# BUILDER
FROM golang:latest AS builder
WORKDIR /go/src/app
COPY . .

RUN go get -d -v ./...
RUN go build -o dalfox

# RUNNING
FROM debian:buster
RUN mkdir /app
COPY --from=builder /go/src/app/dalfox /app/dalfox
COPY --from=builder /go/src/app/samples /app/samples
WORKDIR /app/
CMD ["/app/dalfox"]

이것도 다른 예제

RG BUILD_IMAGE=golang:alpine3.10
ARG BASE_IMAGE=alpine:3.10

FROM ${BUILD_IMAGE} AS build

ADD ./main.go /temp/

WORKDIR /temp

RUN go build -o myApp main.go

FROM ${BASE_IMAGE}

COPY --from=build /temp /temp

WORKDIR /temp

CMD "./myApp"

ECR과 물려쓰는 예제(Java)

FROM xxxxxxxx.xxx.xxxx.xxxxx.amazonaws.com/build-java:latest
WORKDIR /tmp
COPY . .
RUN echo `ls -al`
RUN gradle build



FROM amazoncorretto:17-alpine
COPY --from=0 /tmp/build/libs/springboot-0.0.1.jar /opt/
#CMD ["./app"]