gpt4 book ai didi

java - Docker 中的 gradle 构建速度缓慢。缓存 gradle 构建

转载 作者:行者123 更新时间:2023-12-01 22:48:52 30 4
gpt4 key购买 nike

我正在做大学项目,我们需要同时运行多个 Spring Boot 应用程序。

我已经使用 gradle docker 镜像配置了多阶段构建,然后在 openjdk:jre 镜像中运行应用程序。

这是我的 Dockerfile:

FROM gradle:5.3.0-jdk11-slim as builder
USER root
WORKDIR /usr/src/java-code
COPY . /usr/src/java-code/

RUN gradle bootJar

FROM openjdk:11-jre-slim
EXPOSE 8080
WORKDIR /usr/src/java-app
COPY --from=builder /usr/src/java-code/build/libs/*.jar ./app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

我正在使用 docker-compose 构建和运行所有内容。 docker-compose 的一部分:

 website_server:
build: website-server
image: website-server:latest
container_name: "website-server"
ports:
- "81:8080"

当然,第一次构建需要很长时间。 Docker 正在提取它的所有依赖项。我对此表示同意。

目前一切正常,但代码中的每一个微小变化都会导致一个应用程序的构建时间大约为 1 分钟。

构建日志的一部分:docker-compose up --build

Step 1/10 : FROM gradle:5.3.0-jdk11-slim as builder
---> 668e92a5b906
Step 2/10 : USER root
---> Using cache
---> dac9a962d8b6
Step 3/10 : WORKDIR /usr/src/java-code
---> Using cache
---> e3f4528347f1
Step 4/10 : COPY . /usr/src/java-code/
---> Using cache
---> 52b136a280a2
Step 5/10 : RUN gradle bootJar
---> Running in 88a5ac812ac8

Welcome to Gradle 5.3!

Here are the highlights of this release:
- Feature variants AKA "optional dependencies"
- Type-safe accessors in Kotlin precompiled script plugins
- Gradle Module Metadata 1.0

For more details see https://docs.gradle.org/5.3/release-notes.html

Starting a Gradle Daemon (subsequent builds will be faster)
> Task :compileJava
> Task :processResources
> Task :classes
> Task :bootJar

BUILD SUCCESSFUL in 48s
3 actionable tasks: 3 executed
Removing intermediate container 88a5ac812ac8
---> 4f9beba838ed
Step 6/10 : FROM openjdk:11-jre-slim
---> 0e452dba629c
Step 7/10 : EXPOSE 8080
---> Using cache
---> d5519e55d690
Step 8/10 : WORKDIR /usr/src/java-app
---> Using cache
---> 196f1321db2c
Step 9/10 : COPY --from=builder /usr/src/java-code/build/libs/*.jar ./app.jar
---> d101eefa2487
Step 10/10 : ENTRYPOINT ["java", "-jar", "app.jar"]
---> Running in ad02f0497c8f
Removing intermediate container ad02f0497c8f
---> 0c63eeef8c8e
Successfully built 0c63eeef8c8e
Successfully tagged website-server:latest

每次启动 Gradle 守护进程后都会卡住(后续构建会更快)

我正在考虑使用缓存的 gradle 依赖项添加卷,但我不知道这是否是问题的核心。我也找不到很好的例子。

有什么办法可以加快构建速度吗?

最佳答案

构建需要花费大量时间,因为每次构建 Docker 镜像时 Gradle 都会下载所有插件和依赖项。

无法在镜像构建时挂载卷。但可以引入新的阶段来下载所有依赖项并将其缓存为 Docker 镜像层。

FROM gradle:5.6.4-jdk11 as cache
RUN mkdir -p /home/gradle/cache_home
ENV GRADLE_USER_HOME /home/gradle/cache_home
COPY build.gradle /home/gradle/java-code/
WORKDIR /home/gradle/java-code
RUN gradle clean build -i --stacktrace

FROM gradle:5.6.4-jdk11 as builder
COPY --from=cache /home/gradle/cache_home /home/gradle/.gradle
COPY . /usr/src/java-code/
WORKDIR /usr/src/java-code
RUN gradle bootJar -i --stacktrace

FROM openjdk:11-jre-slim
EXPOSE 8080
USER root
WORKDIR /usr/src/java-app
COPY --from=builder /usr/src/java-code/build/libs/*.jar ./app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

Gradle 插件和依赖项缓存位于 $GRADLE_USER_HOME/caches 中。 GRADLE_USER_HOME 必须设置为与 /home/gradle/.gradle 不同的内容。父 Gradle Docker 镜像中的 /home/gradle/.gradle 被定义为卷,并在每个镜像层之后被删除。

在示例代码中,GRADLE_USER_HOME 设置为 /home/gradle/cache_home

builder阶段,复制Gradle缓存以避免再次下载依赖项:COPY --from=cache/home/gradle/cache_home/home/gradle/.gradle.

仅当 build.gradle 更改时才会重建阶段缓存。当Java类发生变化时,缓存的图像层及其所有依赖项将被重用。

此修改可以减少构建时间,但使用 Java 应用程序构建 Docker 镜像的更简洁的方法是 Jib由谷歌。有一个Jib Gradle plugin允许为 Java 应用程序构建容器镜像,而无需手动创建 Dockerfile。使用应用程序构建镜像并运行容器类似于:

gradle clean build jib
docker-compose up

关于java - Docker 中的 gradle 构建速度缓慢。缓存 gradle 构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58593661/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com