백구의 코딩찌개
  • [DOCKER] Docker 빌드 시, Multi Stage 사용하기
    2024년 08월 21일 16시 23분 24초에 업로드 된 글입니다.
    작성자: 코딩백구
    반응형

    여느때처럼 프로젝트 파일을 빌드 후 Dockerfile 로 배포하기위해 Script 를 작성하던 중, 예전부터 거슬렸던 Docker Image 크기가 눈에 들어왔다.

    불필요한 파일은 제외하고, 빌드된 결과만을 사용하려면 어떻게 해야할까?

     

    기존 Script (Single Stage)

    # Use the official Golang image as the base image
    FROM golang:1.22.3-alpine
    
    # Set the working directory inside the container
    WORKDIR /app
    
    # Copy the source code into the container
    COPY ./src ./
    
    # Build the Go application
    RUN go build -o main.exe .
    
    # Set the entry point for the container
    ENTRYPOINT ["./main.exe","--log=production"]

    Script 를 보면 알 수 있듯이, 통째로 복사 후, 빌드하고 실행시켜 효율성은 고려하지 않는 생각없어 보이는 코드이다.

     

    수정된 Script (Multi Stage)

    # Use the official Golang image as the base image
    FROM golang:1.22.3-alpine AS builder
    
    ENV GO111MODULE=on \
        CGO_ENABLED=0 \
        GOOS=linux \
        GOARCH=amd64
    
    # Set the working directory inside the container
    WORKDIR /build
    
    # Copy the source code into the container
    COPY ./src/ ./
    
    # Build the Go application
    RUN go build -o main.exe .
    
    FROM scratch
    COPY --from=builder /build/main.exe .
    COPY --from=builder /build/logger.conf .
    COPY --from=builder /build/config.toml .
    
    # Set the entry point for the container
    ENTRYPOINT ["./main.exe","--log=production"]

    Builder & Scratch 를 사용해서 Builder 에서는 파일을 우선 Build 하고, 두번째 Stage 에서 필요한 결과물들을 복사 후 실행한다.

    이렇게 하면 초기 Script 처럼 쓸데 없는 코드가 들어가지 않으므로 이미지의 크기가 드라마틱하게 줄어드는것을 볼 수 있다.

     

    이미지 크기 비교

     

    • 위의 467MB 가 기존의 코드대로 빌드한 이미지 사이즈이고,

     

    • 아래의 9MB가 Multi Stage 를 사용하여 빌드한 이미지 사이즈이다.

     

     

     

    작동 또한 잘 되는것을 확인할 수 있다.

     

    데이터를 실시간으로 받아오는 프로그램이나 CGO가 필요하면 alpine 이미지를 사용.

    Scratch 이미지에서 CGO 를 사용하기 위해선 오히려 더 복잡한 과정이 필요할 수 있으므로, alpine 이미지를 사용하는 것이 낫다.

    # Use the official Golang image as the base image
    FROM golang:1.22.3-alpine AS builder
    
    ENV GO111MODULE=on \
        GOOS=linux \
        GOARCH=amd64
    
    # Set the working directory inside the container
    WORKDIR /build
    
    # Copy the source code into the container
    COPY ./src/ ./
    
    # Build the Go application
    RUN go build -o main.exe .
    
    FROM alpine
    COPY --from=builder /build/main.exe .
    COPY --from=builder /build/logger.conf .
    COPY --from=builder /build/config.toml .
    
    # Set the entry point for the container
    ENTRYPOINT ["./main.exe","--log=production"]
    반응형

    'Docker' 카테고리의 다른 글

    [Docker] Docker Network 고정 IP 설정  (0) 2024.09.02
    [DOCKER] Scratch 이미지에 대해서 알아보자  (0) 2024.08.22
    댓글