我如何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