[INFRA-01] backend 멀티스테이지 Dockerfile

작업 내용 (설계 의도)

변경 사항

근거 TDD: ../TDD.md “서버 토폴로지”, “시스템 역할 경계”. backend에 Dockerfile이 없어(find backend -iname Dockerfile → 0건) 앱을 컨테이너화할 수 없다. 멀티스테이지 Dockerfile을 신설해 dev/prod 스택이 공통으로 쓸 sports-backend:<tag> 이미지를 생성한다.

  • 빌드 스테이지: gradle로 bootJar 산출 (Java 17, Kotlin 1.9.23, Spring Boot 3.3.5).
  • 런타임 스테이지: JRE 17 slim, non-root 유저, EXPOSE 8080, HEALTHCHECK/actuator/health 폴링.
  • .dockerignore로 build 캐시·.gradle·테스트 산출물 제외해 빌드 컨텍스트 최소화.
  • 앱 설정은 이미 application.yml${ENV:default}로 외부화 → Dockerfile은 env 주입 없이 이미지만 생성(주입은 override 담당).

의존

  • 없음

다이어그램

클래스 의존

flowchart LR
    Src["backend/src"] --> Build["build stage: gradle bootJar"]
    Build --> Jar["app.jar"]
    Jar --> Runtime["runtime stage: JRE17 non-root"]
    Runtime --> Image["sports-backend:tag"]

테스트 케이스

  • docker build -t sports-backend:test backend/가 exit 0으로 이미지를 생성한다
  • 생성 이미지를 docker run하면 /actuator/health가 200 UP을 반환한다
  • hadolint backend/Dockerfile이 error 0건이다
  • 컨테이너가 non-root 유저로 실행된다(docker exec ... id -u ≠ 0)
  • .dockerignorebuild/·.gradle/을 제외해 빌드 컨텍스트에 포함되지 않는다