Dangil project(5)

Junyoung·2024년 5월 23일

Dangil Project

목록 보기
5/20
FROM openjdk:17

WORKDIR /usr/src/app

COPY build.gradle gradlew settings.gradle .

COPY gradle gradle

COPY src src

RUN chmod +x gradlew 

# exec 형식으로 java -jar 파일명.jar 실행 방법을 표현
# 컨테이너 실행시에 해당 명령어를 실행한다
ENTRYPOINT ["java","-jar","app.jar"]

위 방법은 모든 자바 파일들과 상태를 그대로 옮겨놔야 한다 !

왜냐? 위 방법은 파이프라인에서 빌드를 하는 경우이기 때문이다 !

이미지 빌드시에 그냥 → jar 파일을 만들어서 둔다면 굳이 다른 파일들을 가져갈 필요가 없는거다 ! ! ! ! !

멀티 스테이지 빌드

FROM openjdk:17-alpine AS builder

WORKDIR /usr/src/app

# 실행 환경을 만들어준다
COPY build.gradle gradlew settings.gradle .

COPY gradle gradle

COPY src src

# 파일을 복사해오면 실행 권한이 없기에 실행 권한을 부여한다 !
RUN chmod +x gradlew

# 빌드를 실행한다 !
RUN ./gradlew clean bootJar

# 새로운 빌드를 시작한다 기존의 데이터들이 없어진다 !
FROM openjdk:17-alpine

WORKDIR /usr/src/app

ARG JAR_FILE=build/libs/*.jar

COPY --from=builder /usr/src/app/${JAR_FILE} app.jar

ENTRYPOINT ["java","-jar","app.jar"]

위 그림처럼 이미지 메모리가 약 87MB 절약 된것을 확인할 수 있다.

지금은 큰 메모리 차이가 발생하지 않지만, 제한된 환경에서 도커의 이미지를 빌드해야 하는 상황이라면 이처럼 멀티 스테이지 빌드를 통해 필요한 .jar 파일만 도출해서 사용할 수 있다.

docker build -t spring .
docker images

이후 해당 이미지를 통해서 컨테이너를 실행시켰다.

성공적으로 컨테이너가 로드됐다

이처럼 멀티 스테이지 빌드를 통해서

이미지의 크기를 감소시키고, 불필요한 소스 코드는 이미지화 되지 않기 때문에 보안성도 향상된다.
또한, 빌드 환경하고 실행환경을 분리할 수 있다.
즉, 젠킨스에서 해당 이미지 빌드시에 젠킨스에서 tool을 가지고 있지 않아도 괜찮다 !

profile
라곰

0개의 댓글