Gradle 和 Docker:如何 运行 在 Docker 容器中构建 Gradle?

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

我有以下 docker 文件 运行 是 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"]

问题是目前我必须先在我的主机上 运行 gradle clean build 才能在我的本地机器上创建 jar 文件,路径为:

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

如何将此 gradle clean build 放入我的 docker 文件中,以便构建步骤在 内部 容器中完成?

编辑:

我希望用户的步骤是:

  1. github
  2. 克隆我的项目
  3. 运行 docker build -t pokerstats . - 这将执行 gradle build
  4. 运行 docker 容器 运行 -d -p 8080:8080 pokerstats

用户将从 github 克隆我的项目 - 然后我希望他们能够 运行 docker 容器,而无需使用 gradle 构建项目首先 - 即我希望 docker 文件进行构建并将 jar 复制到容器中。

阅读 this article 后,我已经能够使用多阶段 Docker 构建解决此问题。请参阅下面的 Docker 文件:

# 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}