我想在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:resolve
与dependency: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/