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를 사용하면 추가 명령어 인자가 전달될 경우에도 유연하게 실행 가능합니다.