개념
왜 멀티스테이지 빌드?
일반 빌드: 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 멀티스테이지 결과 비교하기
# 차이가 얼마나 나는지 확인!