Java

Java

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

출처: 문서

본문

이 예시는 Java 애플리케이션을 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:24.04 AS builder

WORKDIR /app
COPY . ./

RUN apt-get update && apt-get install -y default-jdk maven --no-install-recommends && rm -rf /var/lib/apt/lists/*

RUN mvn -B package -DskipTests

FROM ubuntu:24.04

RUN apt-get update && apt-get install -y default-jre --no-install-recommends && rm -rf /var/lib/apt/lists/*

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

ENTRYPOINT ["java", "-jar", "/app/app.jar"]

Before (Wolfi)

#syntax=docker/dockerfile:1

FROM cgr.dev/chainguard/maven:latest-dev AS builder

WORKDIR /app
COPY . ./

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

RUN mvn -B package -DskipTests

FROM cgr.dev/chainguard/jre:latest

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

ENTRYPOINT ["java", "-jar", "/app/app.jar"]

Before (DOI)

#syntax=docker/dockerfile:1

FROM maven:3.9-eclipse-temurin-21 AS builder

WORKDIR /app
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 mvn -B package -DskipTests

FROM eclipse-temurin:21-jre

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

ENTRYPOINT ["java", "-jar", "/app/app.jar"]

After (multi-stage)

#syntax=docker/dockerfile:1

# === Build stage: Compile and package the Java application with Maven ===
FROM dhi.io/maven:3-jdk21-alpine3.22-dev AS builder

WORKDIR /app
COPY . ./

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

RUN mvn -B package -DskipTests

# === Final stage: Create minimal runtime image ===
FROM dhi.io/eclipse-temurin:21-alpine3.22

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

ENTRYPOINT ["java", "-jar", "/app/app.jar"]

After (single-stage)

#syntax=docker/dockerfile:1

FROM dhi.io/maven:3-jdk21-alpine3.22-dev

WORKDIR /app
COPY . ./

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

RUN mvn -B package -DskipTests

ENTRYPOINT ["java", "-jar", "/app/target/app.jar"]

더 알아보기 (Learn more)