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 文件中,以便构建步骤在 内部 容器中完成?
编辑:
我希望用户的步骤是:
- 从
github
克隆我的项目
- 运行
docker build -t pokerstats .
- 这将执行 gradle build
- 运行 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}
我有以下 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 文件中,以便构建步骤在 内部 容器中完成?
编辑:
我希望用户的步骤是:
- 从
github
克隆我的项目
- 运行
docker build -t pokerstats .
- 这将执行 gradle build - 运行 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}