如何在Docker Multi Stage构建层中缓存Maven依赖项和插件?

时间:2017-12-25 14:12:28

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

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

我的Dockerfile如下所示:

tf.tensordot(X, Y, axes=((2,),(0,)))

```

我将此Dockerfile基于Docker Multi Stage Build blog postalso available on Github)中提供的示例。

当我运行构建时,不是看到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 ... 下载了一次依赖项,然后由dependency:resolve重新使用,我看到这两个步骤都下载了依赖项。

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

2 个答案:

答案 0 :(得分:4)

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

  

dependency:resolve告诉Maven解决所有依赖关系   显示版本。 JAVA 9注意:将在何时显示模块名称   使用Java 9运行。

     

依赖:resolve-plugins告诉Maven解决   插件及其依赖项。

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

答案 1 :(得分:2)

我想在这个上花两美分。

我从这个Dockerfile开始:

FROM maven:3-jdk-10 AS build

RUN mkdir /src
WORKDIR /src
COPY pom.xml .
RUN mvn -B dependency:resolve-plugins dependency:resolve

COPY . .
RUN mvn package

目标是在构建步骤(mvn package)期间没有下载任何依赖项。

我尝试添加@Apolozeus在答案中提到的clean package技巧,但这没有效果。在我的情况下,我确保在测试期间下载并在编译期间下载了一个mapstruct插件。

我最终做的是在pom.xml中明确添加这两个插件,以便及早下载:

    <dependency>
        <groupId>org.apache.maven.surefire</groupId>
        <artifactId>surefire-junit4</artifactId>
        <version>2.21.0</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.2.0.Final</version>
        <scope>compile</scope>
    </dependency>

这样可以在构建步骤中不再进行下载,从而加快构建速度。