멀티스테이지 빌드로 용량최적화
도커빌드이미지는 용량이 무척 크다
그래서 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"]