phonebill/deployment/container/build-image.md
ondal f12fed5de9 Jenkins 기반 CI/CD 파이프라인 구성
- Kustomize 기반 환경별(dev/staging/prod) 매니페스트 관리
- Jenkins 파이프라인 스크립트 작성 (Podman, Gradle, kubectl 컨테이너)
- SonarQube 코드 품질 분석 및 Quality Gate 연동
- 수동 배포 및 리소스 검증 스크립트 추가
- k8s 매니페스트 구조 재정리 (configmaps, secrets, deployments, services 분리)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 10:23:32 +09:00

3.7 KiB

백엔드 컨테이너 이미지 작성 결과서

개요

본 문서는 phonebill 프로젝트의 백엔드 마이크로서비스들의 컨테이너 이미지 빌드 과정과 결과를 기록합니다.

대상 서비스

서비스명 설명
api-gateway API Gateway 서비스
user-service 사용자 인증/관리 서비스
bill-service 요금 조회 서비스
product-service 상품 변경 서비스
kos-mock KOS 목업 서비스

Dockerfile 구성

파일 위치: deployment/container/Dockerfile-backend

# Build stage
FROM eclipse-temurin:21-jdk AS builder
ARG BUILD_LIB_DIR
ARG ARTIFACTORY_FILE
COPY ${BUILD_LIB_DIR}/${ARTIFACTORY_FILE} app.jar

# Run stage
FROM eclipse-temurin:21-jre-alpine
ENV USERNAME=k8s
ENV ARTIFACTORY_HOME=/home/${USERNAME}
ENV JAVA_OPTS=""

# Add a non-root user
RUN addgroup -S ${USERNAME} && \
    adduser -S -G ${USERNAME} ${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"]

Dockerfile 특징

  • 멀티스테이지 빌드: 빌드와 실행 환경 분리로 이미지 크기 최적화
  • 베이스 이미지: Eclipse Temurin 21 JRE Alpine (경량화)
  • 보안: 비루트 사용자(k8s)로 실행
  • 유연성: JAVA_OPTS 환경변수로 JVM 옵션 설정 가능

빌드 과정

1. Gradle 빌드 (JAR 파일 생성)

./gradlew clean build -x test

2. 컨테이너 이미지 빌드

각 서비스별로 아래 명령을 실행합니다:

DOCKER_FILE=deployment/container/Dockerfile-backend

# api-gateway
docker build \
  --platform linux/amd64 \
  --build-arg BUILD_LIB_DIR="api-gateway/build/libs" \
  --build-arg ARTIFACTORY_FILE="api-gateway.jar" \
  -f ${DOCKER_FILE} \
  -t api-gateway:latest .

# user-service
docker build \
  --platform linux/amd64 \
  --build-arg BUILD_LIB_DIR="user-service/build/libs" \
  --build-arg ARTIFACTORY_FILE="user-service.jar" \
  -f ${DOCKER_FILE} \
  -t user-service:latest .

# bill-service
docker build \
  --platform linux/amd64 \
  --build-arg BUILD_LIB_DIR="bill-service/build/libs" \
  --build-arg ARTIFACTORY_FILE="bill-service.jar" \
  -f ${DOCKER_FILE} \
  -t bill-service:latest .

# product-service
docker build \
  --platform linux/amd64 \
  --build-arg BUILD_LIB_DIR="product-service/build/libs" \
  --build-arg ARTIFACTORY_FILE="product-service.jar" \
  -f ${DOCKER_FILE} \
  -t product-service:latest .

# kos-mock
docker build \
  --platform linux/amd64 \
  --build-arg BUILD_LIB_DIR="kos-mock/build/libs" \
  --build-arg ARTIFACTORY_FILE="kos-mock.jar" \
  -f ${DOCKER_FILE} \
  -t kos-mock:latest .

빌드 결과

생성된 이미지 목록

이미지명 태그 크기 상태
api-gateway latest 158MB 성공
user-service latest 205MB 성공
bill-service latest 214MB 성공
product-service latest 220MB 성공
kos-mock latest 201MB 성공

이미지 확인 명령

docker images | grep -E "api-gateway|user-service|bill-service|product-service|kos-mock"

이미지 레지스트리 푸시 (선택)

Azure Container Registry에 푸시하는 경우:

REGISTRY=docker.io
PROJECT=hiondal
TAG=latest

# 로그인
az acr login --name acrdigitalgarage01

# 태그 및 푸시
for service in api-gateway user-service bill-service product-service kos-mock; do
  docker tag ${service}:latest ${REGISTRY}/${PROJECT}/${service}:${TAG}
  docker push ${REGISTRY}/${PROJECT}/${service}:${TAG}
done

작성일

2025-11-27