# HealthSync Backend 통합 Dockerfile # 전체 멀티프로젝트를 한 번에 빌드하고 특정 서비스를 선택 실행 # ============================================================================= # Build Stage: 전체 멀티프로젝트 빌드 # ============================================================================= FROM openjdk:21-jdk-slim AS builder # 빌드에 필요한 패키지 설치 RUN apt-get update && apt-get install -y \ curl \ && rm -rf /var/lib/apt/lists/* WORKDIR /workspace # Gradle Wrapper 및 설정 파일 복사 COPY gradle/ gradle/ COPY gradlew . COPY gradle.properties . COPY settings.gradle . COPY build.gradle . # 각 서비스 소스코드 복사 COPY common/ common/ COPY api-gateway/ api-gateway/ COPY user-service/ user-service/ COPY health-service/ health-service/ COPY intelligence-service/ intelligence-service/ COPY goal-service/ goal-service/ COPY motivator-service/ motivator-service/ # Gradle 실행 권한 부여 RUN chmod +x gradlew # 전체 프로젝트 빌드 (테스트 제외) RUN ./gradlew clean build -x test # 빌드된 JAR 파일들 확인 RUN find . -name "*.jar" -type f # ============================================================================= # Runtime Stage: 실행 환경 # ============================================================================= FROM openjdk:21-jdk-slim # 런타임 사용자 생성 RUN addgroup --system --gid 1001 healthsync && \ adduser --system --uid 1001 --gid 1001 healthsync # 작업 디렉토리 설정 WORKDIR /app # 빌드된 JAR 파일들 복사 COPY --from=builder /workspace/api-gateway/build/libs/*.jar ./jars/api-gateway.jar COPY --from=builder /workspace/user-service/build/libs/*.jar ./jars/user-service.jar COPY --from=builder /workspace/health-service/build/libs/*.jar ./jars/health-service.jar COPY --from=builder /workspace/intelligence-service/build/libs/*.jar ./jars/intelligence-service.jar COPY --from=builder /workspace/goal-service/build/libs/*.jar ./jars/goal-service.jar COPY --from=builder /workspace/motivator-service/build/libs/*.jar ./jars/motivator-service.jar # 실행 스크립트 생성 RUN cat > /app/start-service.sh << 'EOF' #!/bin/bash SERVICE_NAME=${SERVICE_NAME:-user-service} JAVA_OPTS=${JAVA_OPTS:-"-Xms256m -Xmx1024m"} echo "Starting HealthSync ${SERVICE_NAME}..." echo "Java Options: ${JAVA_OPTS}" case ${SERVICE_NAME} in "api-gateway") exec java ${JAVA_OPTS} -jar /app/jars/api-gateway.jar ;; "user-service") exec java ${JAVA_OPTS} -jar /app/jars/user-service.jar ;; "health-service") exec java ${JAVA_OPTS} -jar /app/jars/health-service.jar ;; "intelligence-service") exec java ${JAVA_OPTS} -jar /app/jars/intelligence-service.jar ;; "goal-service") exec java ${JAVA_OPTS} -jar /app/jars/goal-service.jar ;; "motivator-service") exec java ${JAVA_OPTS} -jar /app/jars/motivator-service.jar ;; *) echo "Error: Unknown service name '${SERVICE_NAME}'" echo "Available services: api-gateway, user-service, health-service, intelligence-service, goal-service, motivator-service" exit 1 ;; esac EOF # 스크립트 실행 권한 부여 RUN chmod +x /app/start-service.sh # 디렉토리 소유자 변경 RUN chown -R healthsync:healthsync /app # 사용자 변경 USER healthsync # 헬스체크 스크립트 생성 HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD curl -f http://localhost:${SERVER_PORT:-8080}/actuator/health || exit 1 # 기본 포트 노출 (환경변수로 오버라이드 가능) EXPOSE 8080 8081 8082 8083 8084 8085 # 환경변수 기본값 설정 ENV SERVICE_NAME=user-service ENV JAVA_OPTS="-Xms256m -Xmx1024m" ENV SPRING_PROFILES_ACTIVE=docker # 실행 명령 ENTRYPOINT ["/app/start-service.sh"]