【发布时间】:2020-02-23 21:07:59
【问题描述】:
我正在做一个大学项目,我们需要一次运行多个 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
每次在Starting a Gradle Daemon (subsequent builds will be faster)之后冻结
我正在考虑使用缓存的 gradle 依赖项添加卷,但我不知道这是否是问题的核心。我也找不到很好的例子。
有什么方法可以加快构建速度?
【问题讨论】:
-
我对Java和Gradle不是很熟悉,但是这和本地开发中的行为不一样吗?我的意思是,如果您对代码进行了一些更改,则需要重新编译项目以将更改也应用到运行时。也许您的意思是 Gradle 重新编译所有项目,而不仅仅是更改的部分?
-
发布的 Dockerfile 工作正常,但问题是速度。在本地构建大约需要 8 秒,在 Docker 中大约需要 1 到 1.5 分钟。我想知道是否有办法加快 docker build。
标签: java docker gradle caching gradlew