121 lines
3.8 KiB
Docker
121 lines
3.8 KiB
Docker
# 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"]
|