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!
同样的技巧可以在很多情况下使用。 你也可以用节点npm
, yarn
或其他包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/