Builders & Multi-Stage Build 사례

Dockerfile Syntax | The difference of ARG and ENV in Dockerfile
이민석's avatar
Jun 08, 2024
Builders & Multi-Stage Build 사례

개요

Docker Container Image를 만들때 필요한 것실행할때 필요한 것은 다릅니다.
따라서 이를 분리할 수 있다면, 더욱 효율적인 기능 제공이 가능할 것입니다.

builder를 사용해서 Docker Container Image를 경량화하고 안전하게 만들 수 있습니다.

일반적인 Docker Container Image

Docker Container Image를 경량화 하기 위해서는 알파인(Alphine)이미지를 사용합니다.

FROM node:latest
FROM node:latest-alphine

하지만 이 경우에도 서비스를 실행하기 위한 라이브러리(e.g. node_modules)각종 종속성 모듈(e.g. apt, yum)들이 필요할 것입니다. 또한 빌드 이후에는 불필요한 라이브러리들(e.g. typescript, eslint)이 존재할 수도 있을 것입니다.

이러한 모듈들을 구분해서 설치하기 위해서 사용되는 것이 빌더 패턴(Builder Pattern)입니다.

빌더 패턴(Builder Pattern)

빌더 패턴(Builder Pattern)은 빌드와 러닝 이미지를 분리하는 패턴입니다.

  • 빌드 이미지(Build Image) : 앱 빌드에 필요한 디펜던시 설정, 빌드 후 바이너리(Binary)를 만들고 이를 러닝 이미지에 전달

  • 러닝 이미지(Runnign Image) : 빌드 시에 제공된 바이너리 모듈만 사용

멀티 스테이지 빌드(Multi-Stage Build)

아래에 빌드 이미지와 러닝 이미지를 구분하여 작동 시키는 Dalfox 라이브러리의 Dockerfile 예제가 있습니다.

# 빌드 이미지(Build Image)
FROM golang:latest AS builder
WORKDIR /go/src/app
COPY . .
d
RUN go get -d -v ./...
RUN go build -o dalfox

# 러닝 이미지(Running Image)
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"

참고 자료

Share article

Unchaptered