Skip to content

[feat] Dockerfile, docker-compose, Kubernetes 매니페스트 추가#797

Open
dasomel wants to merge 3 commits into
eGovFramework:mainfrom
dasomel-eGovFramework:feat/docker-and-k8s-5.0.x
Open

[feat] Dockerfile, docker-compose, Kubernetes 매니페스트 추가#797
dasomel wants to merge 3 commits into
eGovFramework:mainfrom
dasomel-eGovFramework:feat/docker-and-k8s-5.0.x

Conversation

@dasomel
Copy link
Copy Markdown
Contributor

@dasomel dasomel commented May 20, 2026

변경 사유

컨테이너 이미지/k8s 매니페스트가 없어 로컬 빌드와 수동 배포만 가능합니다. tomcat:10.1-jre17 기반 최소 산출물을 추가합니다.

변경 내용

  • Dockerfile — multi-stage maven:3.9-eclipse-temurin-17tomcat:10.1-jre17, 기본 ROOT 앱 제거 후 war를 ROOT.war로 배치, pom.xml 선행 캐싱
  • .dockerignore — 빌드 컨텍스트 축소
  • docker-compose.yml — 단일 서비스, ${APP_VERSION:-5.0.0} 변수화
  • k8s/deployment.yaml — 1 replica RollingUpdate, runAsNonRoot, drop ALL, 253개 공통컴포넌트 번들에 맞춘 resource requests/limits (500m–2000m CPU / 1Gi–2Gi), liveness/readiness probe(/)
  • k8s/service.yaml — ClusterIP 8080

영향 범위

  • 애플리케이션 코드 변경 없음
  • image: 태그는 예시 — 운영 환경 레지스트리로 교체 필요
  • 외부 DB가 필요하나 본 PR 범위에는 포함하지 않음 (별도 매니페스트로 분리 권장)

체크리스트

  • 단일 주제(컨테이너화 + k8s 매니페스트)
  • 5.0.x 브랜치 대상
  • 기존 코드 미변경

The repo has no container image definition or k8s manifests. Add a
minimal but production-shaped set built on top of tomcat:10.1-jre17.

- Dockerfile: multi-stage Maven 3.9 + Temurin 17 -> tomcat:10.1-jre17,
  default ROOT app dropped and replaced with the built war. Copies
  pom.xml first for layer caching, then src/ and script/.
- .dockerignore: keep build context small.
- docker-compose.yml: single-service compose for demo runs.
- k8s/deployment.yaml: replica=1 RollingUpdate, runAsNonRoot, drop ALL,
  resource requests/limits sized for the large 253-function bundle
  (500m-2000m CPU, 1Gi-2Gi memory), liveness/readiness probes on /,
  ephemeral Tomcat work/temp/logs volumes.
- k8s/service.yaml: ClusterIP exposing port 8080.
@dasomel dasomel changed the base branch from 5.0.x to main May 26, 2026 15:50
@dasomel dasomel changed the title [feat][5.0.x] Dockerfile, docker-compose, Kubernetes 매니페스트 추가 [feat] Dockerfile, docker-compose, Kubernetes 매니페스트 추가 May 26, 2026
@eGovFrameSupport
Copy link
Copy Markdown
Collaborator

표준프레임워크에 대한 지속적인 참여와 소중한 PR에 대단히 감사드립니다.

제출해 주신 코드를 기반으로 내부 인프라 환경(Docker/Kubernetes)에서 빌드 및 배포 검증을 진행하였으나, 아래 두 가지 항목에서 정상적으로 구동되지 않는 현상이 확인되어 공유해 드립니다.

  1. 외부 서드파티 라이브러리(smeapi) 도커 빌드 실패
    현재 프로젝트 내 src/main/webapp/WEB-INF/lib/project/smeapi/2.7.0 경로에 smeapi.jar 파일이 포함되어 있어 기존 로컬 톰캣 환경에서는 정상 구동되지만, 격리된 도커 환경(Multi-stage build)에서 클린 빌드를 수행할 때 메이븐이 해당 내부 경로의 라이브러리를 인식하지 못해 컴파일 에러(package x3.client.smeapi does not exist)가 발생하고 있습니다.

  2. Kubernetes 배포 후 파드(Pod) 기동 실패
    쿠버네티스 배포 검증 시, 헬스 체크 실패로 인해 파드가 지속적으로 재시작(CrashLoopBackOff) 되며 정상적으로 기동되지 못하는 현상이 발생하고 있습니다. (현재 설정된 프로브 경로와 프로젝트 구조 간의 헬스 체크 연동 문제로 추정됩니다.)

더불어 표준프레임워크 가이드라인으로서 처음 접하는 사용자도 쉽게 활용할 수 있도록, 처음 도커 빌드 및 실행을 테스트할 때 참고할 수 있는 간단한 '도커 시작 가이드(실행 명령어 등)'를 README나 PR 내용에 함께 포함해 주시면 감사하겠습니다.

소중한 기여에 다시 한번 감사드립니다.

dasomel added 2 commits June 5, 2026 01:34
격리된 멀티스테이지 도커 빌드에서 중앙 저장소에 없는 smeapi jar를 찾지 못해
'package x3.client.smeapi does not exist' 컴파일 오류가 발생하던 문제를
빌드 스테이지의 install:install-file 단계로 해결한다.

또한 k8s 프로브 경로를 ROOT('/')에서 정적 리소스(/css/**)로 변경한다.
ROOT 경로는 DispatcherServlet/스프링 시큐리티/DB에 의존해 기동 시점에
302/500을 반환하면서 CrashLoopBackOff를 유발했다. permitAllList에 포함된
정적 경로는 인증·DB 없이 200을 반환하며, startupProbe를 추가해 느린 기동
중 livenessProbe에 의한 조기 재시작을 방지한다.
처음 사용하는 사용자가 따라 할 수 있도록 도커 빌드/실행, docker compose,
쿠버네티스 배포 및 접속·헬스체크 방법을 k8s/README.md에 정리한다.
@dasomel
Copy link
Copy Markdown
Contributor Author

dasomel commented Jun 4, 2026

검증 중 발견하신 세 가지를 반영했습니다.

  1. smeapi 빌드 실패: 격리된 멀티스테이지 빌드에서 동봉 jar(project:smeapi:2.7.0)를 찾지 못하던 문제를 빌드 스테이지의 mvn install:install-file 단계로 해결했습니다. pom의 좌표와 일치시키고 COPY src 이후 설치하도록 순서를 조정했습니다.
  2. CrashLoopBackOff: 프로브 경로를 /에서 정적 리소스 /css/egovframework/com/com12.css로 변경했습니다. ROOT 경로는 스프링 시큐리티/DB에 의존해 기동 초기 302/500을 반환하지만, 이 경로는 시큐리티 permitAllList에 포함된 정적 자원이라 인증·DB 없이 200을 반환합니다. 느린 기동 대비 startupProbe도 추가했습니다.
  3. 시작 가이드: k8s/README.md에 도커/compose/k8s 빌드·실행·접속·헬스체크 절차를 정리했습니다(멀티스테이지 빌드라 mvn package 선행 불필요함을 명시).

로컬 환경 제약으로 도커 클린 빌드와 k8s 기동까지의 실런타임 검증은 수행하지 못했습니다. Dockerfile/매니페스트 문법과 헬스 경로의 보안 허용 여부·파일 존재는 정적으로 확인했습니다. 가능하시면 클린 빌드 한 번 더 확인 부탁드립니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants