
# --------------------------
# 1단계: Build Stage
# FROM gradle:8.2.1-jdk17 AS build : Gradle이 설치된 이미지를 사용하여 환경 일관성 유지
# WORKDIR /app : 컨테이너 내 작업 디렉토리 설정 ( cd /app 같은 효과 )
# COPY . . : 로컬 프로젝트 소스를 컨테이너로 복사
# --------------------------
FROM gradle:8.2.1-jdk17 AS build
WORKDIR /app
COPY . .
RUN ./gradlew clean bootJar
# --------------------------
# 2단계: Runtime Stage
# COPY --from=build ... : 빌드 단계에서 만든 JAR만 복사
# COPY entrypoint.sh . : 실행 스크립트 추가
# RUN chmod +x entrypoint.sh : 실행 권한 부여
# --------------------------
FROM amazoncorretto:17
WORKDIR /app
COPY --from=build /app/build/libs/*.jar app.jar
COPY entrypoint.sh .
RUN chmod +x entrypoint.sh
# 실행에 필요한 환경 변수들
ENV PROJECT_NAME=discodeit
ENV PROJECT_VERSION=1.2-M8
ENV JVM_OPTS=""
EXPOSE 80
ENTRYPOINT ["./entrypoint.sh"]
왜 멀티 스테이지로? 🤔
entrypoint.sh
#!/bin/sh
exec java $JVM_OPTS -jar app.jar
entrypoint.sh를 사용해서 얻는 장점 ❗
.dockeringnor활용
version: "3.8"
services:
app:
build: .
ports:
- "8081:80"
environment:
SPRING_PROFILES_ACTIVE: prod
STORAGE_TYPE: local
DATABASE_URL: jdbc:postgresql://postgres:5432/discodeit
DATABASE_USERNAME: discodeit_user
DATABASE_PASSWORD: discodeit1234
volumes:
- .discodeit/storage:/app/.discodeit/storage
depends_on:
- postgres
postgres:
image: postgres:17
environment:
POSTGRES_DB: discodeit
POSTGRES_USER: discodeit_user
POSTGRES_PASSWORD: discodeit1234
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
- ./schema.sql:/docker-entrypoint-initdb.d/schema.sql
volumes:
pgdata:
app 서비스 ( Spring Boot 애플리케이션 ) 🌱
postgres 서비스 ( PostgreSQL DB ) 🐘
.env 파일 예시
SPRING_PROFILES_ACTIVE=prod
STORAGE_TYPE=local
DATABASE_URL=jdbc:postgresql://postgres:5432/discodeit
DATABASE_USERNAME=discodeit_user
DATABASE_PASSWORD=discodeit1234
environment:
- SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}