먼저 간단한 프로젝트를 생성하여 클로닝 해놓는다.
https://github.com/thom-droid/docker-test.git
현재는 windows 환경에서 진행하므로 docker와 WSL를 실행한다.
프로젝트 루트로 이동하여, Dockerfile을 생성한 뒤 다음과 같이 작성한다.
FROM eclipse-temurin:11-jdk-alpine as TEMP_BUILD_IMAGE
ENV APP_HOME=/usr/app/
WORKDIR $APP_HOME
COPY gradlew $APP_HOME
COPY build.gradle $APP_HOME
COPY settings.gradle $APP_HOME
COPY gradle $APP_HOME/gradle
COPY src src
RUN ./gradlew bootJar
FROM eclipse-temurin:11-jdk-alpine
ENV APP_HOME=/usr/app/
WORKDIR $APP_HOME
COPY --from=TEMP_BUILD_IMAGE $APP_HOME/build/libs/*.jar $APP_HOME/app.jar
ENTRYPOINT ["java", "-jar", "./app.jar"]
FROM와 as <NAME>을 사용하여 FROM에서 실행한 결과를 한 Dockerfile 안의 다른 instruction에서 사용할 수 있다.
이를 multi-stage 빌드라고 하며 필요한 부분만을 사용해서 빌드하여 도커 이미지의 크기를 줄이는 방법이다. 외부 도커 이미지를 stage에 추가할 수도 있다.
COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf
위 코드를 간단히 해석하면 다음과 같다. 먼저 처음 FROM은
jdk 이미지를 TEMP_BUILD_IMAGE로 명명하고,
현재 루트에 있는, 빌드에 필요한 파일들 (gradlew, build.gradle etc)을 모두 APP_HOME으로 복사한다.
그리고 ./gradlew를 통해 jar 파일을 생성한다.