본문 바로가기

Docker

Dockerfile 내에서 gradle 빌드 후 spring boot 이미지 생성 (Multi Stage)

728x90
반응형

배포환경을 구성할 때 간혹 gradle의 다양한 버전을 이용해서 배포해야하는 경우가 있다.

서버에 세팅된 gradle 버전 말고 다른 버전을 사용해야 할 경우 젠킨스 플러그인 설치 말고 gradle이미지를 이용해서 빌드를 하고 이미지를 생성하는 방법을 사용할 수 있다.

Docker Multi Stage 라고 한다.

 

하나의 Dockerfile안에서 빌드하고 실행이미지를 생성할 수 있다. 

 

이전단계의 artifact를 복사해서 새로운 빌드단계에서 사용할 수 있다. 

 

Dockerfile

FROM gradle:6.9.2-jdk11-alpine AS TEMP_BUILD_IMAGE
WORKDIR /home/gradle/src/

COPY --chown=gradle:gradle . /home/gradle/src
USER root
RUN chown -R gradle /home/gradle/src

COPY . .
RUN gradle clean bootJar



FROM openjdk:11-jre-slim
COPY --from=TEMP_BUILD_IMAGE $APP_HOME/build/libs/ROOT.jar  /application/ROOT.jar

WORKDIR /application

EXPOSE 8080

ENTRYPOINT ["java", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap", "-Djava.security.egd=file:/dev/./urandom","-jar","/application/ROOT.jar"]

 

 

설명을 하자면

FROM 명령어에 AS 빌드이름을 이용해서 이름을 지정한다.

 

그리고 다음에 나오는 FROM절에서 COPY명령을 이용해 사용할 수 있다.

첫 번째 단계에서 AS TEMP_BUILD_IMAGE라는 이름을 이용해서 gradle빌드 환경을 구성했다.

 

COPY --chown=gradle:gradle . /home/gradle/src

호스트의 소스를 gradle 권한을 주면서 컨테이너로 복사한다.

RUN gradle clean bootJar

컨테이너에서 gradle로 빌드한다.

 

COPY --from=TEMP_BUILD_IMAGE $APP_HOME/build/libs/ROOT.jar  /application/ROOT.jar

후속 FROM에서 COPY명령어를 이용해서 이전 artifact를 현재 빌드단계로 복사해온다.

 

빌드된 이미지를 실행파일로 만들어서 최종이미지가 만들어진다.

RUN jar -xvf /application/ROOT.jar

복사해온 이미지를 풀고 싶다면 RUN명령어를 쓰면 된다.

다만, FROM이미지가 jre면 jar가 없기 때문에 jdk를 이용해야 한다.

728x90
반응형