개념

왜 멀티스테이지 빌드?

일반 빌드: JDK + 소스코드 + 빌드툴 전부 이미지에 포함
           → 이미지 크기 1GB 넘음

멀티스테이지:
  1단계(builder): JDK로 jar 파일 빌드
  2단계(runtime): JRE + jar 파일만 복사
           → 이미지 크기 200MB 수준

보안상으로도 빌드 도구가 운영 이미지에 없는 게 맞음

Dockerfile 작성

위치: team3-app/ 루트에 Dockerfile

구조 힌트:
────────────────────────────────
1단계 - builder
  FROM eclipse-temurin:17-jdk AS builder
  
  해야 할 것:
  □ WORKDIR 설정
  □ 소스 전체 COPY
  □ Maven으로 jar 빌드 (테스트 스킵)
  
  힌트: ./mvnw clean package -DskipTests

────────────────────────────────
2단계 - runtime
  FROM eclipse-temurin:17-jre

  해야 할 것:
  □ WORKDIR 설정
  □ builder에서 jar 파일만 COPY
  □ 보안을 위해 root 말고 다른 유저로 실행
  □ 포트 선언
  □ 실행 명령

  힌트:
  - COPY --from=builder ...
  - USER nonroot  ← 가이드 필수 항목
  - EXPOSE 8080
  - ENTRYPOINT ["java", "-jar", "app.jar"]
────────────────────────────────

⚠️ jar 파일 경로 확인:
mvn 빌드 후 target/ 폴더에 뭐가 생기는지 먼저 확인

로컬 빌드 + 실행 확인

# 빌드
docker build -t foldy:test .

# 실행 (로컬 DB 연결)
docker run -p 8080:8080 \
  -e SPRING_DATASOURCE_URL=jdbc:mysql://host.docker.internal:3306/foldy?serverTimezone=Asia/Seoul \
  -e SPRING_DATASOURCE_USERNAME=foldy \
  -e SPRING_DATASOURCE_PASSWORD=1234 \
  foldy:test

# 확인
curl http://localhost:8080/actuator/health
# {"status":"UP"} 나오면 성공!

application.properties 환경변수화

지금 application.properties에 하드코딩된 것들:
- spring.datasource.url
- spring.datasource.username
- spring.datasource.password
- jwt.secret

이걸 환경변수로 바꿔야 함

힌트:
spring.datasource.url=${DB_URL}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
jwt.secret=${JWT_SECRET}

왜?
→ 나중에 K8s Secret에서 이 값들을 주입할 예정
→ 코드에 비밀번호가 남으면 안되기 때문

⚠️ 로컬 개발용은 어떻게?
방법 1: IDE Run Configuration에서 환경변수 설정
방법 2: .env 파일 + .gitignore 처리

이미지 크기 확인

docker images foldy

# builder 스테이지 포함 vs 멀티스테이지 결과 비교하기
# 차이가 얼마나 나는지 확인!