@ Джек Гор - большое спасибо за указание мне пути. Я видел пост, но окончательного ответа еще не было. После погружения во все отдельные ответы информация дала мне как ответ на симптом, так и понимание того, как решать подобные вопросы.
ОТВЕТ : С помощью файла Docker вы можете создавать окончательные изображения с помощью одного или нескольких последующих слоев изображений. Чтобы шаг не перезагружал зависимости каждый раз, вы можете создать слой изображения для «загрузки мира» зависимостей. Повторная загрузка будет выполняться только при изменении зависимости в файле pom.xml.
Чтобы сделать это, вы разбили Dockerfile на 2 этапа сборки: сначала скопируйте файл pom.xml и соберите его. Это создаст слой изображения со всеми зависимостями. В качестве второго шага вы создаете приложение.
FROM java:8
FROM maven:alpine
# image layer
WORKDIR /app
ADD pom.xml /app
RUN mvn verify clean --fail-never
# Image layer: with the application
COPY . /app
RUN mvn -v
RUN mvn clean install -DskipTests
EXPOSE 8080
ADD ./target/your.jar /developments/
ENTRYPOINT ["java","-jar","/developments/your.jar"]
Тогда вы получите следующий сценарий сборки:
- В первый раз вы создаете эту (сборку Docker) зависимости, которые загружаются, и на шаге 2 создается jar приложения.
- При немедленной перестройке зависимости (pom.xml) и исходные тексты приложений не изменились. Таким образом, слои изображения не нужно менять. Сборка готова в кратчайшие сроки.
- Если вы измените 1 из ваших исходных файлов приложения, будет загружено всего несколько загрузок, и приложение будет собрано. Таким образом, вы НЕ загружаете мир.
- Если вы измените файл pom.xml, тем самым изменив зависимости, то все загрузки зависимостей будут завершены.
Влияние разделения слоев изображения показано через количество очень коротких видеороликов .
Недостатком этого способа построения является, конечно, то, что конечное (производственное) изображение содержит больше, чем приложение. В нем есть не только JAR, но и ряд зависимостей.
Как решить, что этот iamge слишком велик:
- Уменьшите размер изображения с помощью трюка. Используйте опцию: --squash. Это объясняется в этом посте .
- Отделяйте процесс сборки (здесь: maven и / или ng build --prod) как шаг перед шагом сборки докера. Затем выполните сборку Docker и поместите ТОЛЬКО файл jar в окончательное изображение.
- Использование среды CI / CD с, например, Дженкинсфайл (конвейер). В конвейере Jenkins вы сначала строите образ. Все зависимости уже есть. Вы только перестройте приложение. Вы выполняете сборку докера и т. Д.
Для моего случая это лучший вариант из возможных. Вы автоматизируете процесс И сохраняете размер изображения низким.