Зависимость загрузки 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"
Мне это кажется глупым, но, по крайней мере, пока это работает.