javadockergradlejar

Gradle and Docker: How to run a Gradle build within Docker container?


I have the following docker file that runs a spring boot application:

# For Java 11, try this
FROM adoptopenjdk/openjdk11:alpine-jre

#
ARG JAR_FILE=/build/libs/pokerstats-0.0.1-SNAPSHOT.jar

#
WORKDIR /opt/app

#
COPY ${JAR_FILE} app.jar

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

The issue is that currently I have to run gradle clean build on my host machine first to create the jar file on my local machine at path:

/build/libs/pokerstats-0.0.1-SNAPSHOT.jar

How can I put this gradle clean build into my docker file so that the build step is done inside the container?

edit:

I want the steps for a user to be:

  1. Clone my project from github
  2. run docker build -t pokerstats . - which will do the gradle build
  3. run docker container run -d -p 8080:8080 pokerstats

The user will clone my project from github - I then want them to be able to run the docker container without having to build the project with gradle first - I.e. I want the docker file to do the build and copy the jar into the container.


Solution

  • After reading this article I have been able to solve this using a Multi Stage Docker Build. Please see the Docker file below:

    # using multistage docker build
    # ref: https://docs.docker.com/develop/develop-images/multistage-build/
        
    # temp container to build using gradle
    FROM gradle:5.3.0-jdk-alpine AS TEMP_BUILD_IMAGE
    ENV APP_HOME=/usr/app/
    WORKDIR $APP_HOME
    COPY build.gradle settings.gradle $APP_HOME
      
    COPY gradle $APP_HOME/gradle
    COPY --chown=gradle:gradle . /home/gradle/src
    USER root
    RUN chown -R gradle /home/gradle/src
        
    RUN gradle build || return 0
    COPY . .
    RUN gradle clean build
        
    # actual container
    FROM adoptopenjdk/openjdk11:alpine-jre
    ENV ARTIFACT_NAME=pokerstats-0.0.1-SNAPSHOT.jar
    ENV APP_HOME=/usr/app/
        
    WORKDIR $APP_HOME
    COPY --from=TEMP_BUILD_IMAGE $APP_HOME/build/libs/$ARTIFACT_NAME .
        
    EXPOSE 8080
    ENTRYPOINT exec java -jar ${ARTIFACT_NAME}