spring boot dockerfile 작성 방법(gradle)
spring boot referecne을 참고하여 build 및 prod로 배포까지 가능하도록 Dockerfile을 작성했다.
FROM openjdk:8-jdk-alpine as build
WORKDIR /workspace/app
COPY . /workspace/app
RUN ./gradlew clean build # or bootJar
RUN mkdir -p build/dependency && (cd build/dependency; jar -xf ../libs/*.jar)
FROM openjdk:8-jdk-alpine AS local
VOLUME /tmp
ARG DEPENDENCY=/workspace/app/build/dependency
COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java", "-cp", "app:app/lib/*", "com.demo.example.ExampleApplication"]
FROM openjdk:8-jdk-alpine AS prod
VOLUME /tmp
ARG DEPENDENCY=/workspace/app/build/dependency
COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java", "-cp", "app:app/lib/*", "com.demo.example.ExampleApplication"]
처음에는 https://spring.io/guides/topicals/spring-boot-docker/#_experimental_features에 나오는 --mount=type=cache
기능을 잘 몰라 적용하지 않았다.
찾아본 결과, 첫 build 시 의존성과 패키지 등을 다운로드 받은 후 해당 디렉터리를 caching할 수 있는 기능이다. rebuild를 할 때 재다운로드 받는 것을 skip할 수 있다.
아래 명령어를 통해 적용할 수 있다.
# syntax=docker/dockerfile:experimental
RUN --mount=type=cache,target=/root/.gradle ./gradlew clean build
더 자세한 내용은 [[docker-buildkit#cache]]에 작성해 놓았다.