배포 가이드 및 명령어 추가
- 배포 관련 slash 명령어 추가 (컨테이너 이미지 빌드, 실행, K8s 배포, CI/CD) - 백엔드/프론트엔드 각각에 대한 배포 가이드 문서 추가 - 프롬프트 파일 추가 (think, design, develop) - deployment 디렉토리 생성 - 기존 명령어 파일 업데이트 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
# 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"]
|
||||
@@ -0,0 +1,232 @@
|
||||
# 백엔드 컨테이너 이미지 빌드 결과
|
||||
|
||||
## 프로젝트 정보
|
||||
- **프로젝트명**: kt-event-marketing
|
||||
- **빌드 일시**: 2025-10-27
|
||||
- **빌드 대상**: 3개 마이크로서비스 (content-service, participation-service, user-service)
|
||||
|
||||
## 1. 사전 준비
|
||||
|
||||
### 1.1 서비스 확인
|
||||
settings.gradle에서 확인된 구현 완료 서비스:
|
||||
- ✅ content-service
|
||||
- ✅ participation-service
|
||||
- ✅ user-service
|
||||
- ⏳ ai-service (미구현)
|
||||
- ⏳ analytics-service (미구현)
|
||||
- ⏳ distribution-service (미구현)
|
||||
- ⏳ event-service (미구현)
|
||||
|
||||
### 1.2 bootJar 설정 확인
|
||||
build.gradle에 이미 설정되어 있음 (line 101-103):
|
||||
```gradle
|
||||
bootJar {
|
||||
archiveFileName = "${project.name}.jar"
|
||||
}
|
||||
```
|
||||
|
||||
## 2. Dockerfile 생성
|
||||
|
||||
### 2.1 디렉토리 생성
|
||||
```bash
|
||||
mkdir -p deployment/container
|
||||
```
|
||||
|
||||
### 2.2 Dockerfile-backend 작성
|
||||
파일 위치: `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로 이미지 크기 최적화
|
||||
- Non-root user(k8s) 생성으로 보안 강화
|
||||
- JAVA_OPTS 환경 변수로 JVM 옵션 설정 가능
|
||||
|
||||
## 3. JAR 파일 빌드
|
||||
|
||||
### 3.1 빌드 명령어
|
||||
```bash
|
||||
./gradlew :content-service:bootJar :participation-service:bootJar :user-service:bootJar
|
||||
```
|
||||
|
||||
### 3.2 빌드 결과
|
||||
```
|
||||
BUILD SUCCESSFUL in 15s
|
||||
18 actionable tasks: 5 executed, 13 up-to-date
|
||||
```
|
||||
|
||||
### 3.3 생성된 JAR 파일
|
||||
```bash
|
||||
$ ls -lh */build/libs/*.jar
|
||||
|
||||
-rw-r--r-- 1 KTDS 197121 78M content-service/build/libs/content-service.jar
|
||||
-rw-r--r-- 1 KTDS 197121 85M participation-service/build/libs/participation-service.jar
|
||||
-rw-r--r-- 1 KTDS 197121 96M user-service/build/libs/user-service.jar
|
||||
```
|
||||
|
||||
## 4. Docker 이미지 빌드
|
||||
|
||||
### 4.1 content-service 이미지 빌드
|
||||
```bash
|
||||
DOCKER_FILE=deployment/container/Dockerfile-backend
|
||||
service=content-service
|
||||
|
||||
docker build \
|
||||
--platform linux/amd64 \
|
||||
--build-arg BUILD_LIB_DIR="${service}/build/libs" \
|
||||
--build-arg ARTIFACTORY_FILE="${service}.jar" \
|
||||
-f ${DOCKER_FILE} \
|
||||
-t ${service}:latest .
|
||||
```
|
||||
|
||||
**빌드 결과**:
|
||||
- Image ID: 06af046cbebe
|
||||
- Size: 1.01GB
|
||||
- Platform: linux/amd64
|
||||
- Status: ✅ SUCCESS
|
||||
|
||||
### 4.2 participation-service 이미지 빌드
|
||||
```bash
|
||||
DOCKER_FILE=deployment/container/Dockerfile-backend
|
||||
service=participation-service
|
||||
|
||||
docker build \
|
||||
--platform linux/amd64 \
|
||||
--build-arg BUILD_LIB_DIR="${service}/build/libs" \
|
||||
--build-arg ARTIFACTORY_FILE="${service}.jar" \
|
||||
-f ${DOCKER_FILE} \
|
||||
-t ${service}:latest .
|
||||
```
|
||||
|
||||
**빌드 결과**:
|
||||
- Image ID: 486f2c00811e
|
||||
- Size: 1.04GB
|
||||
- Platform: linux/amd64
|
||||
- Status: ✅ SUCCESS
|
||||
|
||||
### 4.3 user-service 이미지 빌드
|
||||
```bash
|
||||
DOCKER_FILE=deployment/container/Dockerfile-backend
|
||||
service=user-service
|
||||
|
||||
docker build \
|
||||
--platform linux/amd64 \
|
||||
--build-arg BUILD_LIB_DIR="${service}/build/libs" \
|
||||
--build-arg ARTIFACTORY_FILE="${service}.jar" \
|
||||
-f ${DOCKER_FILE} \
|
||||
-t ${service}:latest .
|
||||
```
|
||||
|
||||
**빌드 결과**:
|
||||
- Image ID: 7ef657c343dd
|
||||
- Size: 1.09GB
|
||||
- Platform: linux/amd64
|
||||
- Status: ✅ SUCCESS
|
||||
|
||||
## 5. 빌드 결과 확인
|
||||
|
||||
### 5.1 이미지 목록 조회
|
||||
```bash
|
||||
$ docker images | grep -E "(content-service|participation-service|user-service)"
|
||||
|
||||
participation-service latest 486f2c00811e 48 seconds ago 1.04GB
|
||||
user-service latest 7ef657c343dd 48 seconds ago 1.09GB
|
||||
content-service latest 06af046cbebe 48 seconds ago 1.01GB
|
||||
```
|
||||
|
||||
### 5.2 빌드 요약
|
||||
| 서비스명 | Image ID | 크기 | 상태 |
|
||||
|---------|----------|------|------|
|
||||
| content-service | 06af046cbebe | 1.01GB | ✅ |
|
||||
| participation-service | 486f2c00811e | 1.04GB | ✅ |
|
||||
| user-service | 7ef657c343dd | 1.09GB | ✅ |
|
||||
|
||||
## 6. 다음 단계
|
||||
|
||||
### 6.1 컨테이너 실행 테스트
|
||||
각 서비스의 Docker 이미지를 컨테이너로 실행하여 동작 확인:
|
||||
```bash
|
||||
docker run -d -p 8080:8080 --name content-service content-service:latest
|
||||
docker run -d -p 8081:8081 --name participation-service participation-service:latest
|
||||
docker run -d -p 8082:8082 --name user-service user-service:latest
|
||||
```
|
||||
|
||||
### 6.2 컨테이너 레지스트리 푸시
|
||||
이미지를 Docker Hub 또는 프라이빗 레지스트리에 푸시:
|
||||
```bash
|
||||
# 이미지 태깅
|
||||
docker tag content-service:latest [registry]/content-service:1.0.0
|
||||
docker tag participation-service:latest [registry]/participation-service:1.0.0
|
||||
docker tag user-service:latest [registry]/user-service:1.0.0
|
||||
|
||||
# 레지스트리 푸시
|
||||
docker push [registry]/content-service:1.0.0
|
||||
docker push [registry]/participation-service:1.0.0
|
||||
docker push [registry]/user-service:1.0.0
|
||||
```
|
||||
|
||||
### 6.3 Kubernetes 배포
|
||||
Kubernetes 클러스터에 배포하기 위한 매니페스트 작성 및 적용
|
||||
|
||||
## 7. 참고 사항
|
||||
|
||||
### 7.1 보안 고려사항
|
||||
- ✅ Non-root user(k8s) 사용으로 보안 강화
|
||||
- ✅ Multi-stage build로 빌드 도구 제외
|
||||
- ⚠️ 프로덕션 환경에서는 이미지 스캔 권장
|
||||
|
||||
### 7.2 이미지 최적화
|
||||
- 현재 이미지 크기: ~1GB
|
||||
- JVM 튜닝 옵션 활용 가능: `JAVA_OPTS` 환경 변수
|
||||
- 추후 경량화 검토: Alpine 기반 이미지, jlink 활용
|
||||
|
||||
### 7.3 빌드 자동화
|
||||
향후 CI/CD 파이프라인에서 자동 빌드 통합 가능:
|
||||
- GitHub Actions
|
||||
- Jenkins
|
||||
- GitLab CI/CD
|
||||
- ArgoCD
|
||||
|
||||
## 8. 문제 해결
|
||||
|
||||
### 8.1 빌드 실패 시
|
||||
- Gradle clean 실행 후 재빌드
|
||||
- Docker daemon 상태 확인
|
||||
- 디스크 공간 확인
|
||||
|
||||
### 8.2 이미지 크기 문제
|
||||
- Multi-stage build 활용 (현재 적용됨)
|
||||
- .dockerignore 파일 활용
|
||||
- 불필요한 의존성 제거
|
||||
|
||||
---
|
||||
|
||||
**작성자**: DevOps Engineer (송근정)
|
||||
**작성일**: 2025-10-27
|
||||
**버전**: 1.0.0
|
||||
Reference in New Issue
Block a user