티스토리 뷰

CI_CD

Scratch 컨테이너란?

ipxy 2025. 3. 20. 09:29
728x90

scratch 컨테이너는 완전히 비어 있는(minimal) 베이스 이미지입니다.

💡 즉, OS도 없고, 쉘도 없고, 패키지 관리 도구도 없는 "완전한 빈 컨테이너"입니다.
일반적으로 가장 작은 크기의 컨테이너를 만들 때 사용됩니다.


Scratch 컨테이너의 특징

항목 설명

기본 이미지 크기 0MB (아무것도 없음)
OS 포함 여부 ❌ 없음
패키지 관리자 (apt, apk 등) ❌ 없음
쉘 (sh, bash 등) ❌ 없음
라이브러리 (glibc, musl 등) ❌ 없음
사용 예시 네이티브 바이너리 실행, 정적 링크된 프로그램

즉, Scratch 컨테이너는 오직 실행 파일만 존재하는 컨테이너입니다.
alpine 같은 가벼운 컨테이너도 OS와 기본 라이브러리가 포함되어 있지만, scratch는 그런 것도 없습니다.


🚀 Scratch 컨테이너를 사용하는 이유

  1. 컨테이너 크기 최소화 (가장 작은 컨테이너)
    • 다른 컨테이너는 OS 라이브러리를 포함하지만, scratch는 아무것도 포함하지 않음
    • 필요 없는 파일이 없으므로, 공격 표면이 작아 보안성이 향상됨
    • 예를 들어, alpine 컨테이너도 5MB 정도 되지만, scratch는 0MB
  2. OS 없이도 실행 가능한 네이티브 바이너리 실행
    • GraalVM, Golang, Rust 같은 정적 링크된 실행 파일을 직접 실행할 때 적합
    • OS에 의존하지 않기 때문에 경량 배포 가능
  3. 보안성이 높음
    • 패키지 관리자, 쉘, 불필요한 라이브러리가 없기 때문에 공격 표면이 최소화됨
    • 컨테이너 내부에서 쉘을 실행할 수도 없으므로, 해킹에 노출될 가능성이 적음

🔥 Scratch 컨테이너 예제

1️⃣ Hello World 실행 파일을 Scratch 컨테이너에서 실행

아래와 같이 완전한 정적 바이너리를 빌드한 후, scratch 컨테이너에서 실행할 수 있습니다.

📌 Dockerfile

# Step 1: 정적 실행 파일 빌드 (Alpine에서 빌드)
FROM alpine:latest AS builder
WORKDIR /app
RUN apk add --no-cache gcc musl-dev
COPY main.c .
RUN gcc -static -o hello main.c  # ✅ 정적 링크된 실행 파일 생성

# Step 2: scratch 컨테이너에 복사 후 실행
FROM scratch
COPY --from=builder /app/hello /hello
ENTRYPOINT ["/hello"]

💡 여기서 scratch는 기본 OS도 없기 때문에, 실행 가능한 파일 하나만 포함됨.


🚀 Scratch 컨테이너에서 GraalVM 네이티브 이미지 실행

Spring Boot 애플리케이션을 GraalVM으로 빌드하면 정적 링크된 실행 파일을 만들 수 있습니다.
이 실행 파일을 scratch 컨테이너에서 실행하면 가장 작은 크기의 경량 컨테이너를 만들 수 있습니다.

📌 Dockerfile

# 1단계: GraalVM으로 정적 링크된 네이티브 이미지 빌드
FROM ghcr.io/graalvm/graalvm-ce:alpine AS builder
WORKDIR /app
RUN apk add --no-cache bash curl gcc musl-dev zlib-dev

# 프로젝트 파일 복사 및 실행 권한 부여
COPY . .
RUN chmod +x ./gradlew

# 네이티브 이미지 빌드 (정적 링크)
RUN ./gradlew nativeCompile \
    -Dorg.graalvm.nativeimage.imagecode=static \
    --no-daemon \
    -Pnative

# 2단계: 최종 실행 환경 (Scratch 컨테이너)
FROM scratch
WORKDIR /

# 실행 파일 복사
COPY --from=builder /app/build/native/nativeCompile/application /application

# 실행 권한 부여
ENTRYPOINT ["/application"]

🔥 결론

  1. scratch는 가장 작은 컨테이너이며, OS도 포함되지 않은 완전한 빈 컨테이너
  2. GraalVM과 같이 정적 링크된 네이티브 실행 파일을 실행할 때 적합
  3. 패키지 관리 도구, 쉘, 시스템 라이브러리가 없어서 보안성이 높고 가볍다
  4. 실행 파일을 정적 링크로 빌드해야만 scratch 컨테이너에서 실행 가능

✅ 결론: GraalVM 네이티브 이미지를 scratch 컨테이너에서 실행하면, 최저 리소스로 Spring Boot를 구동할 수 있다! 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함