maven - 如何在Docker Multi Stage Build Layer中缓存Maven依赖项和插件?

标签 maven docker build dockerfile docker-multi-stage-build

我想在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步骤中都下载了库。

dependency:resolve tells Maven to resolve all dependencies and displays the version. JAVA 9 NOTE: will display the module name when running with Java 9.

dependency:resolve-plugins tells Maven to resolve plugins and their dependencies.



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/

相关文章:

java - 解析 POM 时出错

maven - 从父配置文件激活子配置文件

java - 如何在 Eclipse 中打开 Java 项目(使用 Maven)? (我使用M2E还是maven-eclipse-plugin)

php - docker不能通过symfony和monolog捕获php-fpm输出

c# - 命令 BuildOnlyProject 已禁用

java - IntelliJ 对 Java 项目使用的默认构建过程是什么?

docker - 如何从本地到远程机器使用docker?

Docker 拉取存储库失败,错误为 : Too Many Requests (HAP429)

Android:任务 ':app:processDebugResources' 执行失败

build - Tycho在每个版本上都下载p2.indexes