如何在 Docker 中缓存 maven 依赖项
我正在处理一个具有约200MB依赖项的项目,由于带宽有限,我想避免无用的上传。
当我推送我的Dockerfile(我一会儿会附加它)时,即使我没有触摸pom,我总是有一个~200MB的上传.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中,而是在给定的目录中搜索它们。
我想知道构建一个在构建过程之前执行的脚本,然后将目录复制到容器;然后构建一个“非胖”JAR,该JAR仅链接所有这些依赖项,而不是实际复制到其中。mvn dependency:copy-dependencies
这可能吗?
编辑:我发现容器的 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
...
在构建过程之后,我说有所有的目录I,但一旦我启动JAR,我得到:/root/.m2
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