缓存基于Maven的Docker构建的Jar依赖项

时间:2016-02-01 14:06:42

标签: maven docker dependencies dockerfile

我正在使用这个Dockerfile构建一个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目录中。它是空的。因此,当我更改某些源文件时,所有依赖项都被重新加载。

但是,我注意到如果我从基本图像中更改Maven的版本(例如FROM maven:3.2.5-jdk-8),它就会起作用。

很奇怪,不是吗?

2 个答案:

答案 0 :(得分:2)

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

  

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

     

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

答案 1 :(得分:1)

我担心这是因为他们添加了exe.kill()指令:

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

它使VOLUME成为一个卷,因此构建步骤对该文件夹所做的任何更改都不会被带到以下构建容器中。