【问题标题】:Gradle and Docker: How to run a Gradle build within Docker container?Gradle 和 Docker:如何在 Docker 容器中运行 Gradle 构建?
【发布时间】:2020-07-21 07:08:35
【问题描述】:

我有以下运行 spring boot application 的 docker 文件:

# 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. 运行docker build -t pokerstats . - 它将进行 gradle 构建
  3. 运行 docker 容器运行 -d -p 8080:8080 pokerstats

用户将从 github 克隆我的项目 - 然后我希望他们能够运行 docker 容器,而不必先使用 gradle 构建项目 - 即我希望 docker 文件进行构建并将 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 - 为什么这是个问题?
  • 请注意,您可以使用 Gradle 插件来构建 docker 镜像。有几个,例如com.liferay.app.docker
  • 因为理想情况下我希望在 docker 容器中执行此步骤,因为它是用户在运行我的应用程序之前执行的少一个命令。这可能吗?

标签: java docker gradle jar


【解决方案1】:

阅读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}

【讨论】:

  • 两次运行gradle build有什么用?
  • 我怀疑没有——这个 Dockerfile 中还有其他一些看起来不太正确的行:“COPY . .”,使用 chown 选项复制项目源,然后 chowning再次,从图像中的原始位置复制 gradle - 这些事情让我怀疑两次运行 gradle 是一个疏忽。
  • 我同意其中一些是不需要的,但我认为构建后的COPY . . 正在缓存依赖项。复制 gradle 文件并构建——这将失败,因为缺少 src。然后复制其他所有内容并再次构建,但现在 deps 在上一步中,因此对 src 的更改并不意味着重新下载/构建依赖项。
猜你喜欢
  • 1970-01-01
  • 2017-01-19
  • 2022-10-21
  • 2018-03-29
  • 2023-03-03
  • 1970-01-01
  • 2020-02-23
  • 2020-08-04
  • 2020-12-16
相关资源
最近更新 更多