Backend Dockerfile 작성하기

김재혁·2025년 2월 12일

공통 프로젝트

목록 보기
5/12

Backend Dockerfile 작성

0. 전체 코드

(1)

# Stage 1: Spring Boot 앱 빌드

# Gradle LTS 버전 사용
FROM gradle:8.12-jdk21-alpine AS builder

# 작업 디렉토리 설정
WORKDIR /home/gradle/project

# 전체 소스코드를 복사
COPY --chown=gradle:gradle . .

# gradlew에 실행 권한 부여
RUN chmod +x gradlew

# Gradle 빌드 수행
RUN ./gradlew clean build --no-daemon -x test


# Stage 2: Spring Boot 앱 실행

# 경량화 JRE 이미지 사용
FROM eclipse-temurin:21-jre-alpine

# alpine 기반 컨테이너에 curl 명령어 설치
RUN apk add --no-cache curl

# 작업 디렉토리 생성
WORKDIR /app

# 빌드된 JAR 파일을 고정된 이름으로 복사
COPY --from=builder /home/gradle/project/build/libs/*.jar app.jar

# 보안 강화를 위해 일반 사용자 생성
RUN addgroup -S spring && adduser -S spring -G spring
USER spring

# 실행 포트
EXPOSE 8080

# 실행 명령
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

1. Stage 1: Spring Boot 앱 빌드

(1) 베이스 이미지 선택 및 스테이지 이름 지정

FROM gradle:8.12-jdk21-alpine AS builder
  • gradle:8.12-jdk21-alpine: Java 21을 지원하는 Gradle 기반의 경량 Alpine Linux 이미지를 사용합니다.
  • AS builder: 여러 단계 빌드에서 사용하기 위해 빌드 스테이지에 builder라는 이름을 지정합니다.

(2) 작업 디렉토리 설정

WORKDIR /home/gradle/project
  • 컨테이너 내부에서 /home/gradle/project 디렉토리를 작업 디렉토리로 설정합니다.
  • 이후 실행되는 명령어들은 이 디렉토리를 기준으로 동작합니다.

(3) 프로젝트 파일 복사

COPY --chown=gradle:gradle . .
  • 현재 디렉토리(.)의 모든 파일을 컨테이너의 /home/gradle/project 디렉토리로 복사합니다.
  • --chown=gradle:gradle 옵션을 통해 복사된 파일의 소유자를 gradle 사용자로 설정합니다.

(4) 실행 권한 부여

RUN chmod +x gradlew
  • gradlew 파일(Gradle Wrapper)에 실행 권한을 부여하여 스크립트를 실행할 수 있도록 설정합니다.

(5) 애플리케이션 빌드

RUN ./gradlew clean build --no-daemon -x test
  • ./gradlew clean build 명령어를 실행하여 프로젝트를 빌드합니다.
  • --no-daemon 옵션을 사용하여 Gradle 데몬을 비활성화 → 불필요한 리소스 사용 방지
  • -x test 옵션 추가 → 테스트 실행을 생략하여 빌드 속도 향상

2. Stage 2: 실행 환경 구성

(1) 베이스 이미지 선택

FROM eclipse-temurin:21-jre-alpine
  • eclipse-temurin:21-jre-alpine: Java 21을 실행할 수 있는 경량 JRE 환경 제공
  • Gradle이 필요하지 않으므로 빌드 단계에서 JDK가 포함된 이미지를 사용하고, 실행 단계에서는 JRE만 포함된 가벼운 이미지를 사용하여 최적화합니다.

(2) 필수 패키지 설치

RUN apk add --no-cache curl
  • apk add --no-cache curl: 컨테이너 내에서 curl을 설치합니다. (네트워크 디버깅 등을 위해 필요할 수도 있음)

(3) 작업 디렉토리 설정

WORKDIR /app
  • 컨테이너 내부에서 /app 디렉토리를 작업 디렉토리로 설정합니다.

(4) 빌드된 JAR 파일 복사

COPY --from=builder /home/gradle/project/build/libs/*.jar app.jar
  • --from=builder: 이전 빌드 스테이지(builder)에서 생성된 .jar 파일을 복사합니다.
  • 빌드된 .jar 파일을 /app/app.jar 경로에 저장하여 실행 가능하도록 설정합니다.

(5) 사용자 생성 및 설정

RUN addgroup -S spring && adduser -S spring -G spring
USER spring
  • 보안 강화를 위해 spring 그룹과 spring 사용자를 생성하고, 해당 사용자로 실행되도록 설정합니다.
  • 루트(root) 권한을 사용하지 않도록 하여 보안 위험을 줄입니다.

(6) 포트 노출

EXPOSE 8080
  • 컨테이너가 사용하는 기본 포트(8080)를 명시적으로 선언합니다.
  • 내부적으로는 의미가 없지만, 컨테이너를 실행하는 사람이 어떤 포트를 사용하는지 알기 쉽게 해줍니다.

(7) 애플리케이션 실행 명령어 설정

ENTRYPOINT ["java", "-jar", "/app/app.jar"]
  • 컨테이너가 시작될 때 java -jar /app/app.jar 명령어를 실행하여 Spring Boot 애플리케이션을 실행합니다.
  • ENTRYPOINT를 사용하면 추가 명령어 인자가 전달될 경우에도 유연하게 실행 가능합니다.
profile
志鐵心鏡

0개의 댓글