我想在Docker Multi Stage Build的构建阶段的一层中缓存Maven依赖项。

我的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
...

```

我将这个Dockerfile基于Docker Multi Stage Build blog post(also available on Github)中提供的示例。

运行构建时,没有看到dependency:resolve下载了一次依赖项,然后看到package重新使用了依赖项,而是看到了两个步骤都下载了依赖项。

有人有这个工作吗?我在这里做错了什么?

最佳答案

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



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

即使使用dependency:resolve-plugins,Maven也不会下载所有必需的库,因为package是一个内置目标,并且需要dependency:resolve-plugin在第一次运行时无法解析的其他库。我也尝试了dependency:go-offline,但没有成功。

一种解决方案是在将代码添加到构建镜像之前和之后运行构建目标。这会将所有插件依赖项拉到较低层,从而可以重复使用它们。

将此解决方案应用于上面的示例如下:

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

关于maven - 如何在Docker Multi Stage Build Layer中缓存Maven依赖项和插件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47969389/

10-11 08:25