Mavendockercaching依赖

我正在尝试使用docker来自动化maven构build。 我想构build的项目花费了将近20分钟的时间来下载所有的依赖关系,所以我尝试构build一个caching这些依赖关系的Docker镜像,但似乎并没有保存它。 我的Dockerfile是

FROM maven:alpine RUN mkdir -p /usr/src/app WORKDIR /usr/src/app ADD pom.xml /usr/src/app RUN mvn dependency:go-offline 

图像生成,它下载一切。 但是,生成的图像与base maven:alpine图像大小相同,所以它似乎没有caching图像中的依赖关系。 当我尝试使用该图像进行mvn compile它会在整个20分钟的时间内重新下载所有内容。

是否有可能build立一个caching我的依赖的Maven图像,以便他们不必每次使用图像进行下载都要下载?

我正在运行以下命令:

 docker build -t my-maven . docker run -it --rm --name my-maven-project -v "$PWD":/usr/src/mymaven -w /usr/src/mymaven my-maven mvn compile 

我的理解是,docker构build过程中的任何RUN成为结果图像的一部分。

这是我的Dockerfile ,它caching。 如果在pom.xml文件中没有任何更改,则不会花20分钟时间重新下载所有依赖项。

供参考:

 FROM registry.cn-hangzhou.aliyuncs.com/acs/maven:3-jdk-8 MAINTAINER Eric Kim <kimjuny@foxmail.com> ENV PITBULL_EUREKA=/usr/src/app RUN mkdir -p $PITBULL_EUREKA WORKDIR $PITBULL_EUREKA # add pom.xml only here, and download dependency ADD pom.xml $PITBULL_EUREKA RUN ["/usr/local/bin/mvn-entrypoint.sh", "mvn", "verify", "clean", "--fail-never"] # now we can add all source code and start compiling ADD . $PITBULL_EUREKA RUN ["mvn", "package"] EXPOSE 8888 CMD ["java", "-jar", "./target/eureka-0.0.1-SNAPSHOT.jar"] 

关键是:添加pom.xml ,然后mvn verify它,它会下载Maven的依赖关系。 所以只要pom.xml不改变,它将被caching!

同样的技巧可以在很多情况下使用。 你也可以用节点npmyarn或其他包pipe理这个技巧。

事实certificate,我用作基地的图像有一个定义的父图像

 VOLUME "$USER_HOME_DIR/.m2" 

见: https : //github.com/carlossg/docker-maven/blob/322d0dff5d0531ccaf47bf49338cb3e294fd66c8/jdk-8/Dockerfile

其结果是,在构build过程中,所有的文件都被写入到$USER_HOME_DIR/.m2 ,但是因为它被期望成为一个卷,所以这些文件都没有被容器映像持久化。

目前在Docker中没有任何方法来取消注册该卷定义,所以有必要构build一个单独的Maven图像,而不是使用官方的Maven图像。

如果在容器已经启动之后下载依赖项,则需要在此容器上提交更改,并使用下载的工件创build一个新的映像。

前一阵子我只有一个问题。 networking上有很多解决scheme,但是为我工作的解决scheme只是为maven模块目录安装一个卷:

 mkdir /opt/myvolumes/m2 

然后在Dockerfile中:

 ... VOLUME /opt/myvolumes/m2:/root/.m2 ... 

有更好的解决scheme,但不是那么简单。

这个博客文章帮助你caching所有内容:

https://keyholesoftware.com/2015/01/05/caching-for-maven-docker-builds/