Модифицирует ли spring папку resources
Для сборки sping приложений с помощью gradle в контейнере используется трехступенчатая сборка.
Вопрос вот в чем, создаются ли при сборке spring-приложения какие-то дополнительные файлы или производятся ли модификации файлов в папке resources. Иначе говоря, отличается ли содержимое этой папки в src и в build?
Dockerfile, который я использую:
FROM gradle:latest AS cache
COPY --chown=gradle:gradle ./project /build.gradle /home/gradle/src/build.gradle
RUN mkdir -p /home/gradle/cache_home
ENV GRADLE_USER_HOME /home/gradle/cache_home
WORKDIR /home/gradle/src
RUN gradle clean build -i --stacktrace
FROM gradle:latest AS build
COPY --from=cache /home/gradle/cache_home /home/gradle/.gradle
COPY --chown=gradle:gradle ./project /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle bootJar -i --stacktrace
FROM openjdk:17-jdk-oracle as prod
RUN mkdir /app
RUN mkdir /app/resources
COPY --from=build /home/gradle/src/build/libs/*.jar /app/spring-boot-application.jar
COPY --from=build /home/gradle/src/build/resources /app/resources
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "-Dspring.profiles.active=prod", "/app/spring-boot-application.jar"]
Ибо если изменения не производятся, то стадию prod потенциально можно еще ускорить, используя не
COPY --from=build /home/gradle/src/build/resources /app/resources
а используя вместо этого
COPY ./project/path/to/resources /app/resources
При изменении конфигов на текущий момент производится пересборка контейнера в стадии build, хотя кроме конфигов ничего не меняется.
Протестировав на своих контейнерах я не заметил изменений в resources, но хотелось бы быть уверенным, что такой подход в какой-то степени универсален.
Ответы (1 шт):
производятся ли модификации файлов в папке resources
Если подразумевается src/main/resources, то нет. Ибо это противоречит самой концепции сборки.
Теперь стоит внести ясность в то, куда вообще попадает src/main/resources. Если ты собираешь обычный JAR, то содержимое этой папки попадет в корень jar'ника (jar - это zip-архив), как и скомпилированнные исходники.
Но:
- Есть генерируемые ресурсы. К примеру файл
META-INF/MANIFEST.MF, который может содержать разную служебную информацию, как время сборки. - В процесс сборки могут вмешиваться плагины. Скорее всего у тебя уже включен плагин
spring-bootдля gradle, который творит свою магию при сборке.
P.S. Меня крайне смущает такая конструкция
COPY --from=build /home/gradle/src/build/libs/*.jar /app/spring-boot-application.jar
COPY --from=build /home/gradle/src/build/resources /app/resources
Плагин spring-boot'а для gradle должен собирать твоё приложение в один jar'ник. В этом jar'нике уже есть все ресурсы и библиотеки. Т.е. на выходе у тебя должен быть один jar'ник, сделанный по принципу "всё в одном". Однако ты занимаешься копированием библиотек и ресурсов руками.