.NET

.NET

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

출처: 문서

본문

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

다음 예시는 Docker Hardened Images로 마이그레이션하기 전과 후의 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 (Wolfi)

#syntax=docker/dockerfile:1

FROM cgr.dev/chainguard/dotnet-sdk:latest-dev AS builder

WORKDIR /src
COPY . ./

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

RUN dotnet restore
RUN dotnet publish -c Release -o /src/out --no-restore

FROM cgr.dev/chainguard/aspnet-runtime:latest

WORKDIR /app
COPY --from=builder /src/out ./

ENTRYPOINT ["dotnet", "app.dll"]

Before (DOI)

#syntax=docker/dockerfile:1

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS builder

WORKDIR /src
COPY . ./

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

RUN dotnet restore
RUN dotnet publish -c Release -o /app --no-restore

FROM mcr.microsoft.com/dotnet/aspnet:8.0

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

ENTRYPOINT ["dotnet", "app.dll"]

After (multi-stage)

#syntax=docker/dockerfile:1

# === Build stage: Restore, build, and publish the .NET application ===
FROM dhi.io/dotnet:8-sdk-alpine3.22 AS builder

WORKDIR /src
COPY . ./

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

RUN dotnet restore
RUN dotnet publish -c Release -o /app --no-restore

# === Final stage: Create minimal runtime image ===
FROM dhi.io/aspnetcore:8-alpine3.22

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

ENTRYPOINT ["dotnet", "app.dll"]

After (single-stage)

#syntax=docker/dockerfile:1

FROM dhi.io/dotnet:8-sdk-alpine3.22

WORKDIR /src
COPY . ./

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

RUN dotnet restore
RUN dotnet publish -c Release -o /app --no-restore

WORKDIR /app

ENTRYPOINT ["dotnet", "/app/app.dll"]

더 알아보기 (Learn more)