Spring Containerize

홍준식·2024년 5월 12일

별도의 설정을 하지 않는다면 스프링 부트 프로젝트를 빌드하면 2개의 JAR 파일이 생성된다.
{프로젝트명}-{버전}.jar 파일과 {프로젝트명}-{버전}-plain.jar 파일이다.

여기서 plain 파일을 plain archive, plain이 없는 파일을 executable archive 파일이라고 한다.
plain archive는 프로젝트의 모든 의존성 파일들을 포함하지 않고, 작성된 소스 코드의 클래스와 리소스 파일만을 포함한다.
반면 executable archive는 프로젝트의 모든 의존성 파일을 포함한다.

즉, java -jar {프로젝트명}-{버전}.jar는 정상적으로 스프링 부트 어플리케이션을 실행하지만 java -jar {프로젝트명}-{버전}-plain.jar는 실행하지 못한다.

jar {
	enabled = false
}

build.gradle 파일에 위와 같은 옵션을 추가하여 빌드 후에 executable archive만 생성하도록 설정한다.

FROM gradle:7.6.4-jdk17 AS builder  
WORKDIR /build  
COPY build.gradle settings.gradle /build  
COPY src src  
  
RUN gradle build -x test --parallel  
  
FROM openjdk:17  
WORKDIR /app  
COPY --from=builder /build/build/libs/*.jar /app/app.jar  
  
EXPOSE 8080  
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

멀티스테이지 빌드를 통해 불필요한 빌드 파일들이 어플리케이션 컨테이너에 포함되지 않도록 한다.

별도의 파이프라인으로 테스트를 검증하기에 gradle build시에 -x test 옵션을 주어 테스트 코드를 빌드 시에 실행시키지 않도록 하였다.

$ docker build -t spring-project .
$ docker run -p 80:8080 --env-file .env -it -d spring-project

컨테이너 실행 시에 포트를 바인딩해주고 만약 환경 변수를 설정해야한다면 --env 옵션을 사용하여도 되지만 --env-file로 .env 파일을 사용하도록 하였다.

0개의 댓글