Как кэшировать зависимости maven в Docker ⇐ JAVA
Как кэшировать зависимости maven в Docker
Я работаю над проектом с зависимостями размером ~200 МБ и хочу избежать бесполезной загрузки из-за ограниченной пропускной способности.
Когда я отправляю свой Dockerfile (я прикреплю его через минуту), у меня всегда загружается около 200 МБ, даже если я не трогал pom.xml:
ИЗ maven:3.6.0-jdk-8-slim РАБОЧИЙ ПАРАМЕТР/приложение ДОБАВИТЬ pom.xml/приложение ЗАПУСТИТЬ mvn проверить чистоту --fail-never КОПИРОВАТЬ ./src/app/src ЗАПУСТИТЬ пакет mvn ENV CONFIG_FOLDER=/app/config ENV DATA_FOLDER=/приложение/данные ENV GOLDENS_FOLDER=/app/goldens ENV DEBUG_FOLDER=/приложение/отладка цель WORKDIR CMD ["java","-jar","-Dlogs=/app/logs", "myProject.jar"] Этот Dockerfile должен создать fatJAR размером 200 МБ, включая все зависимости, поэтому загрузка ~ 200 МБ происходит каждый раз. Чего я хотел бы достичь, так это создать слой со всеми зависимостями и «сообщить» на этапе упаковки не включать JAR-файлы зависимостей в fatJAR, а искать их внутри заданного каталога.
Мне было интересно создать сценарий, который выполняет mvn dependency:copy-dependent перед процессом сборки, а затем копирует каталог в контейнер; затем создаем «нежирный» JAR-файл, в котором все эти зависимости только связаны, но не копируются в него.
Возможно ли это?
РЕДАКТИРОВАТЬ: Я обнаружил, что локальный репозиторий контейнера Maven расположен в /root/.m2. Итак, я закончил создание очень простого сценария, такого как этот:
BuildDocker.sh
mvnverify-clean --fail-never мв ~/.m2 ~/git/myProjectRepo/.m2 sudo docker build -t myName/myProject:"$1" И отредактировал Dockerfile следующим образом:
# Использовать официальную среду выполнения Python в качестве родительского образа ОТ maven: 3.6.0-jdk-8-slim # Скопируйте мой локальный репозиторий Mavne в контейнер, создав таким образом новый слой КОПИРОВАТЬ ./.m2 /root/.m2 #Установим рабочий каталог /app РАБОЧИЙ ПАРАМЕТР/приложение # Скопируйте pom.xml ДОБАВИТЬ pom.xml/приложение # Разрешить и загрузить все зависимости: это будет сделано только в том случае, если в pom.xml есть какие-либо изменения. ЗАПУСТИТЬ mvn проверить чистоту --fail-never # Копируем исходный код и конфиги КОПИРОВАТЬ ./src/app/src # создаем ThinJAR ЗАПУСТИТЬ пакет mvn # Запускаем банку ... После процесса сборки я заявил, что /root/.m2 содержит все мои каталоги, но как только я запускаю JAR, я получаю:
Исключение в потоке «main» java.lang.NoClassDefFoundError: org/apache/log4j/Priority в myProject.ThreeMeans.calculate(ThreeMeans.java:17) в myProject.ClusteringStartup.main(ClusteringStartup.java:7) Вызвано: java.lang.ClassNotFoundException: org.apache.log4j.Priority в java.net.URLClassLoader.findClass(URLClassLoader.java:382) в java.lang.ClassLoader.loadClass(ClassLoader.java:424) в sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) в java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... еще 2 Может быть, мне не стоит запускать его через java -jar?
Я работаю над проектом с зависимостями размером ~200 МБ и хочу избежать бесполезной загрузки из-за ограниченной пропускной способности.
Когда я отправляю свой Dockerfile (я прикреплю его через минуту), у меня всегда загружается около 200 МБ, даже если я не трогал pom.xml:
ИЗ maven:3.6.0-jdk-8-slim РАБОЧИЙ ПАРАМЕТР/приложение ДОБАВИТЬ pom.xml/приложение ЗАПУСТИТЬ mvn проверить чистоту --fail-never КОПИРОВАТЬ ./src/app/src ЗАПУСТИТЬ пакет mvn ENV CONFIG_FOLDER=/app/config ENV DATA_FOLDER=/приложение/данные ENV GOLDENS_FOLDER=/app/goldens ENV DEBUG_FOLDER=/приложение/отладка цель WORKDIR CMD ["java","-jar","-Dlogs=/app/logs", "myProject.jar"] Этот Dockerfile должен создать fatJAR размером 200 МБ, включая все зависимости, поэтому загрузка ~ 200 МБ происходит каждый раз. Чего я хотел бы достичь, так это создать слой со всеми зависимостями и «сообщить» на этапе упаковки не включать JAR-файлы зависимостей в fatJAR, а искать их внутри заданного каталога.
Мне было интересно создать сценарий, который выполняет mvn dependency:copy-dependent перед процессом сборки, а затем копирует каталог в контейнер; затем создаем «нежирный» JAR-файл, в котором все эти зависимости только связаны, но не копируются в него.
Возможно ли это?
РЕДАКТИРОВАТЬ: Я обнаружил, что локальный репозиторий контейнера Maven расположен в /root/.m2. Итак, я закончил создание очень простого сценария, такого как этот:
BuildDocker.sh
mvnverify-clean --fail-never мв ~/.m2 ~/git/myProjectRepo/.m2 sudo docker build -t myName/myProject:"$1" И отредактировал Dockerfile следующим образом:
# Использовать официальную среду выполнения Python в качестве родительского образа ОТ maven: 3.6.0-jdk-8-slim # Скопируйте мой локальный репозиторий Mavne в контейнер, создав таким образом новый слой КОПИРОВАТЬ ./.m2 /root/.m2 #Установим рабочий каталог /app РАБОЧИЙ ПАРАМЕТР/приложение # Скопируйте pom.xml ДОБАВИТЬ pom.xml/приложение # Разрешить и загрузить все зависимости: это будет сделано только в том случае, если в pom.xml есть какие-либо изменения. ЗАПУСТИТЬ mvn проверить чистоту --fail-never # Копируем исходный код и конфиги КОПИРОВАТЬ ./src/app/src # создаем ThinJAR ЗАПУСТИТЬ пакет mvn # Запускаем банку ... После процесса сборки я заявил, что /root/.m2 содержит все мои каталоги, но как только я запускаю JAR, я получаю:
Исключение в потоке «main» java.lang.NoClassDefFoundError: org/apache/log4j/Priority в myProject.ThreeMeans.calculate(ThreeMeans.java:17) в myProject.ClusteringStartup.main(ClusteringStartup.java:7) Вызвано: java.lang.ClassNotFoundException: org.apache.log4j.Priority в java.net.URLClassLoader.findClass(URLClassLoader.java:382) в java.lang.ClassLoader.loadClass(ClassLoader.java:424) в sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) в java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... еще 2 Может быть, мне не стоит запускать его через java -jar?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение