Я работаю над проектом с зависимостями ~ 200 МБ, и я хотел бы избежать бесполезных загрузок из-за моей ограниченной пропускной способности.
Когда я нажимаю свой Dockerfile (я его сейчас прикреплю), у меня всегда есть загрузка ~ 200 МБ, даже если я не трогал pom.xml:
FROM maven:3.6.0-jdk-8-slim
WORKDIR /app
ADD pom.xml /app
RUN mvn verify clean --fail-never
COPY ./src /app/src
RUN mvn package
ENV CONFIG_FOLDER=/app/config
ENV DATA_FOLDER=/app/data
ENV GOLDENS_FOLDER=/app/goldens
ENV DEBUG_FOLDER=/app/debug
WORKDIR target
CMD ["java","-jar","-Dlogs=/app/logs", "myProject.jar"]
Этот Dockerfile должен создать 200MB fatJAR, включающий все зависимости, поэтому загрузка ~ 200MB происходит каждый раз.Чего я хотел бы добиться, так это создать слой со всеми зависимостями и «сказать» фазе упаковки, чтобы не включать JAR-файлы зависимостей в fatJAR, а искать их внутри заданного каталога.
Мне было интересносоздать скрипт, который выполняет mvn dependency:copy-dependencies
перед процессом сборки, а затем скопировать каталог в контейнер;затем создание «обезжиренного» JAR, в котором все эти зависимости только связаны и фактически не скопированы в него.
Возможно ли это?
РЕДАКТИРОВАТЬ: Я обнаружил, чтоЛокальное хранилище Maven контейнера находится под /root/.m2
.Поэтому я закончил делать очень простой скрипт, подобный этому:
BuildDocker.sh
mvn verify -clean --fail-never
mv ~/.m2 ~/git/myProjectRepo/.m2
sudo docker build -t myName/myProject:"$1"
И отредактировал Dockerfile , например:
# Use an official Python runtime as a parent image
FROM maven:3.6.0-jdk-8-slim
# Copy my Mavne Local Repository into the container thus creating a new layer
COPY ./.m2 /root/.m2
# Set the working directory to /app
WORKDIR /app
# Copy the pom.xml
ADD pom.xml /app
# Resolve and Download all dependencies: this will be done only if the pom.xml has any changes
RUN mvn verify clean --fail-never
# Copy source code and configs
COPY ./src /app/src
# create a ThinJAR
RUN mvn package
# Run the jar
...
После процесса сборки я заявил, что /root/.m2
имеет все каталоги, которые у меня есть, но как только я запускаю JAR, я получаю:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Priority
at myProject.ThreeMeans.calculate(ThreeMeans.java:17)
at myProject.ClusteringStartup.main(ClusteringStartup.java:7)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 more
Может быть, мне не следует запускать его через java -jar