[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) .dockerignore가build/·.gradle/을 제외해 빌드 컨텍스트에 포함되지 않는다