为基于Maven的Docker构buildcachingJar依赖关系

我从这个Dockerfile构build一个Docker镜像:

FROM maven:3.3.3-jdk-8 MAINTAINER Mickael BARON ADD pom.xml /work/pom.xml WORKDIR /work RUN mvn dependency:go-offline --fail-never ADD ["src", "/work/src"] RUN ["mvn", "package"] 

有了这个Dockerfile,我强制在打包Java项目之前下载依赖项。 因此,我不必每次从我的src目录更改文件时重新下载依赖关系。

但是,有一个问题,这个问题取决于Maven的版本(基本图像)。 事实上,这些依赖关系被下载了,但是它们并没有被保存到容器的〜/ .m2目录中。 它是空的。 因此,当我改变一些源文件时,所有的依赖关系被重新载入。

但是,我注意到,如果我从基本映像(例如FROM maven:3.2.5-jdk-8 )更改Maven的版本,它的工作原理。

很奇怪,不是吗?

有关于此主题的新指令: https : //github.com/carlossg/docker-maven#packaging-a-local-repository-with-the-image

$ MAVEN_CONFIG dir(默认为/root/.m2)被configuration为一个卷,因此在构build时在Dockerfile中复制的任何内容都将丢失。 为此,创build了dir / usr / share / maven / ref /,并且其中的任何内容都将在容器启动时复制到$ MAVEN_CONFIG。

要创build一个预打包的仓库,请创build一个您需要的依赖关系的pom.xml,并在您的Dockerfile中使用它。 /usr/share/maven/ref/settings-docker.xml是一个设置文件,将本地存储库更改为/ usr / share / maven / ref / repository,但只要使用/ usr就可以使用自己的设置文件/ share / maven / ref / repository作为本地回购。

恐怕是因为他们增加了这个VOLUME指令:

https://github.com/carlossg/docker-maven/blame/8ab542b907e69c5269942bcc0915d8dffcc7e9fa/jdk-8/Dockerfile#L11

它使/root/.m2成为一个卷,因此构build步骤对该文件夹所做的任何更改都不会引入以下构build容器。