Зависимость загрузки Gradle Docker

У меня есть Java Gradle Dockerfile, который устанавливает Gradle Wrapper, копирует исходные файлы, создает Jarfile и запускает его:

FROM anapsix/alpine-java:9_jdk

WORKDIR /app

# Prepare Gradle
COPY build.gradle .
COPY gradle/wrapper/gradle-wrapper.jar ./gradle/wrapper/gradle-wrapper.jar
COPY gradle/wrapper/gradle-wrapper.properties ./gradle/wrapper/gradle-wrapper.properties
COPY gradlew .
RUN sh -c "./gradlew"

# Download depencencies here?

COPY . .

# Create Jar
RUN sh -c "./gradlew jar"

EXPOSE 7000

# Run Jar
CMD [ \
  "java", \
  "-jar", "./build/libs/projectname.jar" \
  ]

Это работает нормально, но поскольку шаг jar является первым этапом, на котором загружаются зависимости, каждый раз, когда я изменяю исходный код, все зависимости необходимо загружать снова. Это делает цикл сборки довольно медленным, чем нужно.

Я хотел бы поручить Gradle для загрузки зависимостей, как указано в build.gradle файл за шаг до копирования исходных файлов.

Я пытался просто позвонить RUN sh -c "./gradlew compileJava" перед копированием источников, но Gradle "умный" и говорит, что делать не нужно, тогда как включение одного файла фактически загрузит зависимости.

Есть ли способ просто проинструктировать Gradle для загрузки зависимостей, как указано в build.gradle? Или какой будет лучший обходной путь?

РЕДАКТИРОВАТЬ: я не спрашиваю об использовании Gradle Cache, я спрашиваю об использовании Docker-слоя для хранения зависимостей Gradle.

1 ответ

Обходной путь должен создать фиктивный файл Java и вызов compileJava скачать зависимости:

# Trick to get Gradle to download dependencies
RUN mkdir -p /app/src/main/java
RUN sh -c "echo 'public class Dummy {}' > /app/src/main/java/Dummy.java && ./gradlew compileJava"

Мне это кажется глупым, но, по крайней мере, пока это работает.

Другие вопросы по тегам