방명록
- [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 다음글이 없습니다.이전글이 없습니다.댓글