devops

Docker 도커의 Multi-stage build로 이미지 경량화하기 본문

DevOps/Docker

Docker 도커의 Multi-stage build로 이미지 경량화하기

vata500 2022. 11. 9. 22:19
반응형

Dockerfile을 이용해서 이미지를 빌드하다 보면 최종 컨테이너 이미지에 필요 없는 환경과 파일이 포함될 수 있다. 이를 해결하기 위해서 빌드와 실행을 구분해 이미지를 빌드할 수 있는 'Multi-stage build' 기능을 이용하면 된다.

위처럼 빌드를 통해서 text 파일이 생성되면, 이 파일만 이용해서 내용을 추가하고 최종 스테이지에선 필요한 파일만 사용할 수 있게 된다.

# syntax=docker/dockerfile:1

FROM golang:1.16 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 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"]

간단히 코드를 통해서 살펴보자.

위 코드를 보면 golang:1.16 이미지를 이용해서 빌드를 진행한다. (AS builder를 추가하여 빌드 스테이지 임을 명시)

그리고 다시 alpine:latest 이미지를 실행하는 코드에서 새로운 스테이지가 시작된다.

COPY --from=builder /go/src/github.com/alexellis/href-counter/app ./

위 명령을 보면 --from=builder 선언을 통해서 해당 빌드 스테이지에 존재하는 경로의 파일을 새 스테이지로 복사한다. 대체로 빌드된 아티팩트(app)를 불러오고 마지막 CMD ["./app"] 코드를 통해서 컨테이너 생성과 함께 해당 app 파일이 실행된다.


스테이지는 여러 번 선언이 가능하다.

# 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

위 코드를 보면 FROM으로 이미지 실행과 동시에 AS '이름'을 선언해서 스테이지를 구분 지을 수 있다. CI/CD 파이프라인 구성에 있어서 이미지 경량화는 중요한 작업이기 때문에 multi-stage build는 아주 유용하다.

https://docs.docker.com/build/building/multi-stage/

 

Multi-stage builds

 

docs.docker.com

 

반응형
Comments