티스토리 뷰
728x90
scratch 컨테이너는 완전히 비어 있는(minimal) 베이스 이미지입니다.
💡 즉, OS도 없고, 쉘도 없고, 패키지 관리 도구도 없는 "완전한 빈 컨테이너"입니다.
일반적으로 가장 작은 크기의 컨테이너를 만들 때 사용됩니다.
✅ Scratch 컨테이너의 특징
항목 설명
기본 이미지 크기 | 0MB (아무것도 없음) |
OS 포함 여부 | ❌ 없음 |
패키지 관리자 (apt, apk 등) | ❌ 없음 |
쉘 (sh, bash 등) | ❌ 없음 |
라이브러리 (glibc, musl 등) | ❌ 없음 |
사용 예시 | 네이티브 바이너리 실행, 정적 링크된 프로그램 |
즉, Scratch 컨테이너는 오직 실행 파일만 존재하는 컨테이너입니다.
alpine 같은 가벼운 컨테이너도 OS와 기본 라이브러리가 포함되어 있지만, scratch는 그런 것도 없습니다.
🚀 Scratch 컨테이너를 사용하는 이유
- 컨테이너 크기 최소화 (가장 작은 컨테이너)
- 다른 컨테이너는 OS 라이브러리를 포함하지만, scratch는 아무것도 포함하지 않음
- 필요 없는 파일이 없으므로, 공격 표면이 작아 보안성이 향상됨
- 예를 들어, alpine 컨테이너도 5MB 정도 되지만, scratch는 0MB
- OS 없이도 실행 가능한 네이티브 바이너리 실행
- GraalVM, Golang, Rust 같은 정적 링크된 실행 파일을 직접 실행할 때 적합
- OS에 의존하지 않기 때문에 경량 배포 가능
- 보안성이 높음
- 패키지 관리자, 쉘, 불필요한 라이브러리가 없기 때문에 공격 표면이 최소화됨
- 컨테이너 내부에서 쉘을 실행할 수도 없으므로, 해킹에 노출될 가능성이 적음
🔥 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"]
🔥 결론
- scratch는 가장 작은 컨테이너이며, OS도 포함되지 않은 완전한 빈 컨테이너
- GraalVM과 같이 정적 링크된 네이티브 실행 파일을 실행할 때 적합
- 패키지 관리 도구, 쉘, 시스템 라이브러리가 없어서 보안성이 높고 가볍다
- 실행 파일을 정적 링크로 빌드해야만 scratch 컨테이너에서 실행 가능
✅ 결론: GraalVM 네이티브 이미지를 scratch 컨테이너에서 실행하면, 최저 리소스로 Spring Boot를 구동할 수 있다!
728x90
'CI_CD' 카테고리의 다른 글
Sparse Checkout이란? (0) | 2025.03.20 |
---|---|
Git Submodule이란? (0) | 2025.03.20 |
GitLab을 포함한 Git 환경에서 레포지토리의 일부 코드나 디렉터리만 가져오는 5가지 방법 (0) | 2025.03.20 |
Docker Compose란? (0) | 2025.03.20 |
멀티 레포(Multi-Repo) vs 모노 레포(Mono-Repo) (0) | 2025.03.20 |