# 백엔드 컨테이너 이미지 작성 결과 작성일: 2025-10-27 작성자: DevOps Engineer ## 1. 개요 KT 이벤트 마케팅 플랫폼의 백엔드 마이크로서비스들을 컨테이너 이미지로 빌드하는 과정을 문서화합니다. ## 2. 서비스 현황 ### 2.1 전체 서비스 목록 (settings.gradle 기준) ``` rootProject.name = 'kt-event-marketing' // Common module include 'common' // Microservices include 'user-service' include 'event-service' include 'ai-service' include 'content-service' include 'distribution-service' include 'participation-service' include 'analytics-service' ``` ### 2.2 구현 상태 | 서비스명 | 구현 상태 | JAR 빌드 | 컨테이너 이미지 | 비고 | |---------|----------|---------|---------------|------| | common | ✅ | N/A | N/A | 공통 라이브러리 | | user-service | ⚠️ | ❌ | ⏸️ | 컴파일 에러 (타입 불일치) | | event-service | ✅ | ✅ | ⏸️ | Docker Desktop 필요 | | ai-service | ❌ | ❌ | ❌ | 미구현 | | content-service | ✅ | ✅ | ⏸️ | Docker Desktop 필요 | | distribution-service | ❌ | ❌ | ❌ | 미구현 | | participation-service | ✅ | ✅ | ⏸️ | Docker Desktop 필요 | | analytics-service | ✅ | ✅ | ⏸️ | Docker Desktop 필요 | **빌드 가능 서비스**: 4개 (event-service, content-service, participation-service, analytics-service) ## 3. JAR 파일 빌드 ### 3.1 bootJar 설정 확인 root `build.gradle`에 이미 설정되어 있음: ```gradle // Configure bootJar task for each service bootJar { archiveFileName = "${project.name}.jar" } ``` ### 3.2 JAR 빌드 실행 #### gradlew 실행 권한 설정 (최초 1회) VM 환경에서 실행 시 권한 오류가 발생할 수 있으므로 먼저 실행 권한을 부여합니다: ```bash chmod +x gradlew ``` #### 빌드 명령어 실행 **명령어**: ```bash ./gradlew :analytics-service:bootJar :content-service:bootJar :event-service:bootJar :participation-service:bootJar :user-service:bootJar --no-daemon ``` **권한 오류 발생 시 대체 방법**: ```bash # gradlew에 실행 권한이 없는 경우 bash gradlew :analytics-service:bootJar :content-service:bootJar :event-service:bootJar :participation-service:bootJar :user-service:bootJar --no-daemon ``` **빌드 결과**: ✅ **성공한 서비스 (4개)**: - `analytics-service/build/libs/analytics-service.jar` - `content-service/build/libs/content-service.jar` - `event-service/build/libs/event-service.jar` - `participation-service/build/libs/participation-service.jar` ❌ **실패한 서비스 (1개)**: - `user-service`: 컴파일 에러 발생 **user-service 컴파일 에러 상세**: ``` UserController.java:93: error: incompatible types: UUID cannot be converted to Long Long userId = principal.getUserId(); ^ UserController.java:109: error: incompatible types: UUID cannot be converted to Long Long userId = principal.getUserId(); ^ UserController.java:126: error: incompatible types: UUID cannot be converted to Long Long userId = principal.getUserId(); ^ AuthenticationServiceImpl.java:72: error: method createAccessToken in class JwtTokenProvider cannot be applied to given types; required: UUID,UUID,String,String,List found: Long,String,String,List reason: actual and formal argument lists differ in length ``` **조치 필요**: user-service의 User ID 타입을 Long에서 UUID로 변경 필요 ## 4. Dockerfile 작성 **파일 위치**: `deployment/container/Dockerfile-backend` **내용**: ```dockerfile # Build stage FROM openjdk:23-oraclelinux8 AS builder ARG BUILD_LIB_DIR ARG ARTIFACTORY_FILE COPY ${BUILD_LIB_DIR}/${ARTIFACTORY_FILE} app.jar # Run stage FROM openjdk:23-slim ENV USERNAME=k8s ENV ARTIFACTORY_HOME=/home/${USERNAME} ENV JAVA_OPTS="" # Add a non-root user RUN adduser --system --group ${USERNAME} && \ mkdir -p ${ARTIFACTORY_HOME} && \ chown ${USERNAME}:${USERNAME} ${ARTIFACTORY_HOME} WORKDIR ${ARTIFACTORY_HOME} COPY --from=builder app.jar app.jar RUN chown ${USERNAME}:${USERNAME} app.jar USER ${USERNAME} ENTRYPOINT [ "sh", "-c" ] CMD ["java ${JAVA_OPTS} -jar app.jar"] ``` **특징**: - Multi-stage build (빌드 단계와 실행 단계 분리) - OpenJDK 23 사용 - 비root 사용자(k8s)로 실행하여 보안 강화 - JAVA_OPTS 환경변수로 JVM 옵션 커스터마이징 가능 - linux/amd64 플랫폼 지원 ## 5. 컨테이너 이미지 빌드 ### 5.1 사전 조건 ⚠️ **Docker Desktop 실행 필요** 이미지 빌드 전에 Docker Desktop이 실행되어 있어야 합니다: 1. Windows에서 Docker Desktop 실행 2. 시스템 트레이에서 "Docker Desktop is running" 확인 3. 확인 명령어: `docker ps` ### 5.2 빌드 명령어 #### analytics-service ```bash docker build \ --platform linux/amd64 \ --build-arg BUILD_LIB_DIR="analytics-service/build/libs" \ --build-arg ARTIFACTORY_FILE="analytics-service.jar" \ -f deployment/container/Dockerfile-backend \ -t analytics-service:latest . ``` #### content-service ```bash docker build \ --platform linux/amd64 \ --build-arg BUILD_LIB_DIR="content-service/build/libs" \ --build-arg ARTIFACTORY_FILE="content-service.jar" \ -f deployment/container/Dockerfile-backend \ -t content-service:latest . ``` #### event-service ```bash docker build \ --platform linux/amd64 \ --build-arg BUILD_LIB_DIR="event-service/build/libs" \ --build-arg ARTIFACTORY_FILE="event-service.jar" \ -f deployment/container/Dockerfile-backend \ -t event-service:latest . ``` #### participation-service ```bash docker build \ --platform linux/amd64 \ --build-arg BUILD_LIB_DIR="participation-service/build/libs" \ --build-arg ARTIFACTORY_FILE="participation-service.jar" \ -f deployment/container/Dockerfile-backend \ -t participation-service:latest . ``` ### 5.3 일괄 빌드 스크립트 모든 서비스를 한 번에 빌드하려면 다음 스크립트를 사용하세요: **Windows (PowerShell)**: ```powershell # 빌드 가능한 서비스 목록 $services = @( "analytics-service", "content-service", "event-service", "participation-service" ) # 각 서비스 빌드 foreach ($service in $services) { Write-Host "Building $service..." -ForegroundColor Green docker build ` --platform linux/amd64 ` --build-arg BUILD_LIB_DIR="$service/build/libs" ` --build-arg ARTIFACTORY_FILE="$service.jar" ` -f deployment/container/Dockerfile-backend ` -t ${service}:latest . if ($LASTEXITCODE -eq 0) { Write-Host "✅ $service build completed" -ForegroundColor Green } else { Write-Host "❌ $service build failed" -ForegroundColor Red } } ``` **Linux/Mac (Bash)**: ```bash #!/bin/bash # 빌드 가능한 서비스 목록 services=( "analytics-service" "content-service" "event-service" "participation-service" ) # 각 서비스 빌드 for service in "${services[@]}"; do echo "Building $service..." docker build \ --platform linux/amd64 \ --build-arg BUILD_LIB_DIR="${service}/build/libs" \ --build-arg ARTIFACTORY_FILE="${service}.jar" \ -f deployment/container/Dockerfile-backend \ -t ${service}:latest . if [ $? -eq 0 ]; then echo "✅ $service build completed" else echo "❌ $service build failed" fi done ``` ## 6. 이미지 확인 ### 6.1 빌드된 이미지 목록 확인 ```bash docker images | grep -E "analytics-service|content-service|event-service|participation-service" ``` **예상 출력**: ``` analytics-service latest