Refactor code structure for improved readability and maintainability
This commit is contained in:
+37
-38
@@ -1,27 +1,28 @@
|
||||
# ==========================
|
||||
# 멀티 스테이지 Dockerfile
|
||||
# - 백엔드: Node.js + Express + TypeScript
|
||||
# - 백엔드: Spring Boot (Java 21)
|
||||
# - 프론트엔드: Next.js (프로덕션 빌드)
|
||||
# ==========================
|
||||
|
||||
# ------------------------------
|
||||
# Stage 1: 백엔드 빌드
|
||||
# Stage 1: 백엔드 빌드 (Spring Boot)
|
||||
# ------------------------------
|
||||
FROM node:20.10-alpine AS backend-builder
|
||||
FROM eclipse-temurin:21-jdk-alpine AS backend-builder
|
||||
|
||||
WORKDIR /app/backend
|
||||
|
||||
# 백엔드 의존성 설치
|
||||
COPY backend-node/package*.json ./
|
||||
RUN npm ci --only=production && \
|
||||
npm cache clean --force
|
||||
# Gradle Wrapper 복사
|
||||
COPY backend-spring/gradlew ./
|
||||
COPY backend-spring/gradle ./gradle
|
||||
RUN chmod +x gradlew
|
||||
|
||||
# 백엔드 소스 복사 및 빌드
|
||||
COPY backend-node/tsconfig.json ./
|
||||
COPY backend-node/src ./src
|
||||
RUN npm install -D typescript @types/node && \
|
||||
npm run build && \
|
||||
npm prune --production
|
||||
# 의존성 캐싱
|
||||
COPY backend-spring/build.gradle backend-spring/settings.gradle ./
|
||||
RUN ./gradlew dependencies --no-daemon || true
|
||||
|
||||
# 소스 복사 및 빌드
|
||||
COPY backend-spring/src ./src
|
||||
RUN ./gradlew bootJar --no-daemon
|
||||
|
||||
# ------------------------------
|
||||
# Stage 2: 프론트엔드 빌드
|
||||
@@ -46,38 +47,38 @@ RUN npm run build:no-lint
|
||||
# ------------------------------
|
||||
# Stage 3: 최종 런타임 이미지
|
||||
# ------------------------------
|
||||
FROM node:20.10-alpine AS runtime
|
||||
FROM eclipse-temurin:21-jre-alpine AS runtime
|
||||
|
||||
# 보안 강화: 비특권 사용자 생성
|
||||
RUN addgroup -g 1001 -S nodejs && \
|
||||
adduser -S nodejs -u 1001
|
||||
RUN apk add --no-cache curl nodejs npm
|
||||
|
||||
# 비특권 사용자 생성
|
||||
RUN addgroup -g 1001 -S appgroup && \
|
||||
adduser -S appuser -u 1001 -G appgroup
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# 백엔드 런타임 파일 복사
|
||||
COPY --from=backend-builder --chown=nodejs:nodejs /app/backend/dist ./backend/dist
|
||||
COPY --from=backend-builder --chown=nodejs:nodejs /app/backend/node_modules ./backend/node_modules
|
||||
COPY --from=backend-builder --chown=nodejs:nodejs /app/backend/package.json ./backend/package.json
|
||||
# 백엔드 JAR 복사
|
||||
COPY --from=backend-builder --chown=appuser:appgroup /app/backend/build/libs/*.jar ./backend/app.jar
|
||||
|
||||
# 프론트엔드 런타임 파일 복사
|
||||
COPY --from=frontend-builder --chown=nodejs:nodejs /app/frontend/.next ./frontend/.next
|
||||
COPY --from=frontend-builder --chown=nodejs:nodejs /app/frontend/node_modules ./frontend/node_modules
|
||||
COPY --from=frontend-builder --chown=nodejs:nodejs /app/frontend/package.json ./frontend/package.json
|
||||
COPY --from=frontend-builder --chown=nodejs:nodejs /app/frontend/public ./frontend/public
|
||||
COPY --from=frontend-builder --chown=nodejs:nodejs /app/frontend/next.config.mjs ./frontend/next.config.mjs
|
||||
COPY --from=frontend-builder --chown=appuser:appgroup /app/frontend/.next ./frontend/.next
|
||||
COPY --from=frontend-builder --chown=appuser:appgroup /app/frontend/node_modules ./frontend/node_modules
|
||||
COPY --from=frontend-builder --chown=appuser:appgroup /app/frontend/package.json ./frontend/package.json
|
||||
COPY --from=frontend-builder --chown=appuser:appgroup /app/frontend/public ./frontend/public
|
||||
COPY --from=frontend-builder --chown=appuser:appgroup /app/frontend/next.config.mjs ./frontend/next.config.mjs
|
||||
|
||||
# 업로드 디렉토리 생성 (백엔드용)
|
||||
RUN mkdir -p /app/backend/uploads && \
|
||||
chown -R nodejs:nodejs /app/backend/uploads
|
||||
# 업로드 디렉토리 생성
|
||||
RUN mkdir -p /app/backend/uploads /app/backend/logs && \
|
||||
chown -R appuser:appgroup /app
|
||||
|
||||
# 시작 스크립트 생성
|
||||
RUN echo '#!/bin/sh' > /app/start.sh && \
|
||||
echo 'set -e' >> /app/start.sh && \
|
||||
echo '' >> /app/start.sh && \
|
||||
echo '# 백엔드 시작 (백그라운드)' >> /app/start.sh && \
|
||||
echo '# Spring Boot 백엔드 시작 (백그라운드)' >> /app/start.sh && \
|
||||
echo 'cd /app/backend' >> /app/start.sh && \
|
||||
echo 'echo "Starting backend on port 8080..."' >> /app/start.sh && \
|
||||
echo 'node dist/app.js &' >> /app/start.sh && \
|
||||
echo 'echo "Starting Spring Boot backend on port 8081..."' >> /app/start.sh && \
|
||||
echo 'java -jar app.jar &' >> /app/start.sh && \
|
||||
echo 'BACKEND_PID=$!' >> /app/start.sh && \
|
||||
echo '' >> /app/start.sh && \
|
||||
echo '# 프론트엔드 시작 (포그라운드)' >> /app/start.sh && \
|
||||
@@ -89,18 +90,16 @@ RUN echo '#!/bin/sh' > /app/start.sh && \
|
||||
echo '# 프로세스 모니터링' >> /app/start.sh && \
|
||||
echo 'wait $BACKEND_PID $FRONTEND_PID' >> /app/start.sh && \
|
||||
chmod +x /app/start.sh && \
|
||||
chown nodejs:nodejs /app/start.sh
|
||||
chown appuser:appgroup /app/start.sh
|
||||
|
||||
# 비특권 사용자로 전환
|
||||
USER nodejs
|
||||
USER appuser
|
||||
|
||||
# 포트 노출
|
||||
EXPOSE 3000 8080
|
||||
EXPOSE 3000 8081
|
||||
|
||||
# 헬스체크
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
||||
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1
|
||||
|
||||
# 컨테이너 시작
|
||||
CMD ["/app/start.sh"]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user