Медленная сборка Gradle в Docker. Кэширование gradle build - PullRequest
0 голосов
/ 28 октября 2019

Я занимаюсь университетским проектом, в котором нам нужно запустить несколько приложений Spring Boot одновременно.

Я уже настроил многоэтапную сборку с образом док-станции gradle, а затем запустил приложение в openjdk: jre image.

Вот мой 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"

Конечно, первая сборка занимает много времени. Докер вытягивает все свои зависимости. И я в порядке с этим.

Пока все работает нормально, но каждое небольшое изменение в коде вызывает около 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, но я не знаю, является ли это ядром проблемы. Также я не смог найти хороших примеров для этого.

Есть ли способ ускорить сборку?

1 Ответ

0 голосов
/ 28 октября 2019

Я не знаю много о внутренностях докера, но я думаю, что проблема в том, что каждая новая команда docker build будет копировать все файлы и создавать их (если обнаружит изменения хотя бы в одном файле). Тогда это, скорее всего, изменит несколько jar-файлов, и вторые шаги также должны быть запущены.

Мое предложение состоит в том, чтобы построить на терминале (вне докера) и только в докере создать образ приложения.

Это даже можно автоматизировать с помощью подключаемого модуля Gradle:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...