我如何cachingDocker多阶段构build层中的Maven依赖和插件?

我想将Maven依赖关系caching在我的Docker Multi Stage Build的构build阶段的一层中。

我的Dockerfile如下所示:

FROM maven:3-jdk-8 as mvnbuild RUN mkdir -p /opt/workspace WORKDIR /opt/workspace COPY pom.xml . RUN mvn -B -s /usr/share/maven/ref/settings-docker.xml dependency:resolve COPY . . RUN mvn -B -s /usr/share/maven/ref/settings-docker.xml package FROM openjdk:8-jre-alpine ... 

“`

我基于Docker Multi Stage Build博客文章中提供的示例( 也在Github上提供 )基于此Dockerfile。

当我运行构build,而不是看到依赖下载一次的dependency:resolve ,然后由package重用,我看到两个步骤下载的依赖关系。

有没有人得到这个工作? 我在这里做错了什么?

我遇到了同样的问题。 我发现这是由于Maven目标(例如, dependency:resolve vs dependency:resolve-plugin )之间的差异所致。 基本上, dependency:resolve是为应用程序库, dependency:resolve-plugin是为插件库。 因此,在两个RUN步骤中都会下载库。

dependency:resolve告诉Mavenparsing所有依赖并显示版本。 注意:在使用Java 9运行时将显示模块名称。

依赖:resolve-plugins告诉Mavenparsing插件及其依赖关系。

https://maven.apache.org/plugins/maven-dependency-plugin/index.html

即使使用dependency:resolve-plugins ,Maven也不会下载所有需要的库,因为package是一个内置目标,并且需要额外的dependency:resolve-plugin不知道在第一个RUN中dependency:resolve-plugin库。 我也尝试dependency:go-offline没有成功。

一种解决scheme是在将代码添加到构build映像之前和之后运行构build目标。 这将把所有的插件依赖关系拉入下层,使它们可以被重用。

将这个解决scheme应用到上面的示例如下:

 FROM maven:3-jdk-8 as mvnbuild RUN mkdir -p /opt/workspace WORKDIR /opt/workspace COPY pom.xml . RUN mvn -B -s /usr/share/maven/ref/settings-docker.xml dependency:resolve-plugins dependency:resolve clean package COPY . . RUN mvn -B -s /usr/share/maven/ref/settings-docker.xml clean package FROM openjdk:8-jre-alpine