Go

Go

Go 애플리케이션을 Docker Hardened Images로 마이그레이션하는 예시예요. 마이그레이션 전후의 Dockerfile 변형들을 보여줘요.

출처: 문서

본문

이 예시는 Go 애플리케이션을 Docker Hardened Images로 마이그레이션하는 방법을 보여줘요.

다음 예시는 Docker Hardened Images로 마이그레이션하기 전과 후의 Dockerfile을 보여줘요. 각 예시는 다섯 가지 변형을 포함해요.

  • Before (Ubuntu): DHI로 마이그레이션하기 전에 Ubuntu 기반 이미지를 사용하는 샘플 Dockerfile
  • Before (Wolfi): DHI로 마이그레이션하기 전에 Wolfi 배포판 이미지를 사용하는 샘플 Dockerfile
  • Before (DOI): DHI로 마이그레이션하기 전에 Docker Official Images를 사용하는 샘플 Dockerfile
  • After (multi-stage): 멀티 스테이지 빌드로 DHI에 마이그레이션한 후의 샘플 Dockerfile(최소·안전 이미지에 권장)
  • After (single-stage): 싱글 스테이지 빌드로 DHI에 마이그레이션한 후의 샘플 Dockerfile(더 단순하지만 더 큰 이미지와 더 넓은 공격 표면 초래)

[!NOTE]

멀티 스테이지 빌드는 대부분의 사용 사례에서 권장돼요. 싱글 스테이지 빌드는 단순함을 위해 지원되지만 크기와 보안에서 트레이드오프가 있어요.

Docker Hardened Images를 풀하기 전에 dhi.io에 인증해야 해요. Docker ID 자격 증명(Docker Hub에 사용하는 동일한 사용자 이름과 비밀번호)을 사용해요. Docker 계정이 없다면 무료로 계정을 만들어요.

인증하려면 docker login dhi.io를 실행해요.

Before (Ubuntu)

#syntax=docker/dockerfile:1

FROM ubuntu/go:1.22-24.04

WORKDIR /app
ADD . ./

# Install any additional packages if needed using apt
# RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*

RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" --installsuffix cgo -o main .

ENTRYPOINT ["/app/main"]

Before (Wolfi)

#syntax=docker/dockerfile:1

FROM cgr.dev/chainguard/go:latest-dev

WORKDIR /app
ADD . ./

# Install any additional packages if needed using apk
# RUN apk add --no-cache git

RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" --installsuffix cgo -o main .

ENTRYPOINT ["/app/main"]

Before (DOI)

#syntax=docker/dockerfile:1

FROM golang:latest

WORKDIR /app
ADD . ./

# Install any additional packages if needed using apt
# RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*

RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" --installsuffix cgo -o main .

ENTRYPOINT ["/app/main"]

After (multi-stage)

#syntax=docker/dockerfile:1

# === Build stage: Compile Go application ===
FROM dhi.io/golang:1.25-alpine3.23-dev AS builder

WORKDIR /app
ADD . ./

# Install any additional packages if needed using apk
# RUN apk add --no-cache git

RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" --installsuffix cgo -o main .

# === Final stage: Create minimal runtime image ===
FROM dhi.io/golang:1.25-alpine3.23

WORKDIR /app
COPY --from=builder /app/main  /app/main

ENTRYPOINT ["/app/main"]

After (single-stage)

#syntax=docker/dockerfile:1

FROM dhi.io/golang:1.25-alpine3.23-dev

WORKDIR /app
ADD . ./

# Install any additional packages if needed using apk
# RUN apk add --no-cache git

RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" --installsuffix cgo -o main .

ENTRYPOINT ["/app/main"]

더 알아보기 (Learn more)