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

jav*_*900 7 java jar gradle docker

我有以下运行的 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"]
Run Code Online (Sandbox Code Playgroud)

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

/build/libs/pokerstats-0.0.1-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)

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

编辑:

我希望用户的步骤是:

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

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

jav*_*900 9

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}
Run Code Online (Sandbox Code Playgroud)

  • 我怀疑没有 - 这个 Dockerfile 中还有其他一些行看起来也不太正确:“COPY . .”,使用 chown 选项复制项目源,然后再次 chowning,从原始文件复制 gradle图像中的位置 - 这些事情让我怀疑运行 gradle 两次是一个疏忽。 (6认同)
  • 我同意其中一些是不需要的,但我_认为_ `COPY 。.` 构建之后正在缓存依赖项。复制 gradle 文件并构建——这将失败,因为 src 丢失。然后复制其他所有内容并再次构建,但现在 deps 处于上一步中,因此对 src 的更改并不意味着重新下载/构建依赖项。 (3认同)

Abd*_*hed 8

多阶段构建。确保在您的项目目录中包含build.gradlesettings.gradle文件,我尝试使其尽可能干净和简洁:

#Build stage

FROM gradle:latest AS BUILD
WORKDIR /usr/app/
COPY . . 
RUN gradle build

# Package stage

FROM openjdk:latest
ENV JAR_NAME=app.jar
ENV APP_HOME=/usr/app/
WORKDIR $APP_HOME
COPY --from=BUILD $APP_HOME .
EXPOSE 8080
ENTRYPOINT exec java -jar $APP_HOME/build/libs/$JAR_NAME  
Run Code Online (Sandbox Code Playgroud)

确保将 JAR_NAME 变量更改为您生成的 jar 文件名。