본문 바로가기
Docker

scratch

by xogns93 2024. 12. 4.

"scratch"는 Docker에서 제공하는 가장 최소한의 베이스 이미지입니다. 아무것도 없는 빈 상태의 이미지로, 특정한 환경을 포함하지 않습니다. 이는 도커 이미지에서 가능한 한 작고 가벼운 컨테이너를 만들고자 할 때 유용합니다.


1. scratch란?

  • 정의:

    • Docker에서 제공하는 공식 베이스 이미지 중 하나.
    • 빈 상태의 이미지로, 운영체제나 유틸리티가 포함되어 있지 않음.
    • "Docker의 시작점"이라고 불리며, 다른 이미지를 구축하는 기반으 로 사용됨.
  • 크기:

    • 0바이트. 즉, 어떤 파일이나 기능도 포함하지 않음.

2. scratch 이미지의 특징

  1. 최소한의 환경:

    • 운영체제나 유틸리티가 포함되어 있지 않기 때문에, 매우 가볍고 빠릅니다.
    • 필요한 바이너리와 라이브러리만 포함해야 합니다.
  2. 커스텀 이미지 생성:

    • 완전히 빈 상태에서 시작하기 때문에, 특정 애플리케이션에 맞게 이미지를 구성할 수 있습니다.
  3. 보안 강화:

    • 불필요한 패키지나 유틸리티가 없기 때문에 보안에 취약한 요소를 줄일 수 있습니다.
  4. 주로 컴파일된 애플리케이션에 사용:

    • 고정된 바이너리(예: Go, C, Rust 등으로 빌드된 실행 파일)를 실행하는 데 적합합니다.

3. scratch 사용 방법

scratch 이미지는 도커에서 직접 다운로드하거나 pull 할 필요가 없습니다. 이미 도커에 내장되어 있습니다.

Dockerfile에서 scratch 사용

예를 들어, Go로 만든 간단한 애플리케이션을 scratch 이미지를 사용하여 실행할 수 있습니다:

# 1. Go 애플리케이션을 빌드 (static binary로)
FROM golang:1.20 AS builder
WORKDIR /app
COPY main.go .
RUN go build -o myapp main.go

# 2. scratch를 기반으로 컨테이너 생성
FROM scratch
COPY --from=builder /app/myapp /myapp
ENTRYPOINT ["/myapp"]
  • 빌드된 바이너리만 scratch 이미지에 복사하고 실행.
  • 이 방식은 애플리케이션 크기를 최소화하고, 불필요한 파일들을 배제합니다.

4. scratch의 한계

  1. 운영체제가 없음:

    • 일반적인 리눅스 유틸리티(ls, cat, bash, sh)가 없기 때문에, 디버깅이 어렵습니다.
    • 디버깅이 필요할 경우, Ubuntu나 Alpine과 같은 경량 이미지를 사용하는 것이 좋습니다.
  2. 직접적으로 사용할 수 없음:

    • 기본적으로 모든 애플리케이션 파일과 라이브러리를 직접 포함해야 합니다.
    • 예를 들어, Go나 C로 빌드된 정적 바이너리만 scratch에서 제대로 동작합니다.

5. scratch의 주요 사용 사례

  1. 경량 컨테이너 생성:

    • 애플리케이션 실행에 꼭 필요한 바이너리와 파일만 포함하여 컨테이너 크기를 최소화.
  2. 배포 환경 최적화:

    • CI/CD 파이프라인에서 배포 크기와 시간을 줄이는 데 사용.
  3. 고정된 바이너리 실행:

    • Go, C, Rust로 컴파일된 정적 실행 파일을 포함한 컨테이너.
  4. 보안 강화:

    • 불필요한 유틸리티가 없어서 보안 공격 표면이 줄어듭니다.

6. scratch vs Alpine

Feature scratch Alpine
크기 0바이트 약 5MB
운영체제 포함 없음 경량 리눅스
유틸리티 없음 기본 유틸리티 포함
디버깅 가능 여부 불가능 가능
사용 용도 정적 바이너리 실행 경량 환경 및 디버깅 필요 시

7. 요약

  • scratch는 도커에서 가장 기본이 되는 빈 상태의 베이스 이미지입니다.
  • 모든 유틸리티나 운영체제가 없는 상태에서, 필요한 바이너리만 포함하여 최적화된 컨테이너를 생성하는 데 사용됩니다.
  • Go, C, Rust와 같은 언어로 작성된 정적 실행 파일을 실행하거나, 애플리케이션 배포 크기를 최소화할 때 유용합니다.
  • 디버깅이나 리눅스 도구가 필요한 경우 Alpine과 같은 경량 이미지를 사용하는 것이 더 적합합니다. 😊

'Docker' 카테고리의 다른 글

Docker 레이어  (0) 2024.12.04
Root 파일 시스템(root filesystem)  (1) 2024.12.04
Surface Area  (1) 2024.12.04
Makefile  (0) 2024.12.03
자주 사용하는 Docker 명령어  (0) 2024.12.03