当前位置: 首页 > 知识库问答 >
问题:

如何在Docker多阶段构建层中缓存Maven依赖项和插件?

龚凌
2023-03-14

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

我的泊坞文件如下所示:

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多阶段构建博文(也可以在Github上获得)中提供的例子编写了这个Docker文件。

当我运行构建时,我看到的不是依赖项:resolve下载一次依赖项,然后由,而是通过两个步骤下载的依赖项。

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

共有2个答案

寇景明
2023-03-14

我想在这个上提供我的两分钱。

我从这个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包)。

我尝试添加@Apolozeus在回答中提到的清洁包技巧,但这没有效果。就我而言,我在测试期间下载了surefire,在编译期间下载了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>

这是可行的,在构建步骤中不会发生进一步的下载,这加快了构建的速度。

万俟财
2023-03-14

我遇到了同样的问题。我发现这是由于Maven目标之间的差异(例如依赖:解决依赖:解决插件)。基本上,依赖:解决用于应用程序库,依赖:解决-插件用于插件库。因此,库可以在两个RUN步骤中下载。

依赖关系:解析告诉Maven解析所有依赖关系并显示版本。JAVA 9注意:使用Java9运行时将显示模块名称。

依赖关系:解决插件告诉Maven解决插件及其依赖关系。

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

即使使用依赖项:resolve-plugins,Maven也不会下载所有必需的库,因为是一个内置目标,并且需要其他库,而依赖项:resolve-plugin在第一次运行中不知道要解析。我还尝试了依赖性:离线但没有成功。

一种解决方案是在将代码添加到构建映像之前和之后运行构建目标。这将把所有插件依赖项拉到较低的层中,允许它们被重用。

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

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
 类似资料:
  • 我正在做一个有大约200MB依赖项的项目,我希望避免由于带宽有限而导致的无用上传。 当我推我的Dockerfile(我一会儿会附上)时,我总是有一个~200MB的上传,即使我没有碰pom.xml: 这个Dockerfile应该生成一个200MB的fatJAR,包括所有依赖项,这就是为什么每次都会发生~200MB的上传。我想要实现的是构建一个包含所有依赖项的层,并“告诉”打包阶段不要将依赖项JAR包

  • 我有一个简单的Quarkus应用程序,我尝试使用以下多级Dockerfile构建它。 还有pom.xml 构建工作正常,它下载maven依赖项,然后它创建. jar并在最终容器中运行. jar。但是如果我更改源代码中的某些内容并保持pom.xml不变,依赖项会再次下载。似乎并没有下载所有依赖项。 有没有办法以这种方式加速docker构建?例如,我对Spring Boot做了同样的事情,那里一切都很

  • 我正在尝试在 Docker 容器中构建/部署Spring启动。 如您所见,我用第一个mvn命令缓存了所有的依赖项,这样我的代码应用程序中的每一个变化都不会触发新的大量依赖项下载。它适用于大多数依赖项,但仍有一些需要下载(即使缓存)。这是第二个mvn命令(包)的日志: (顺便说一句,(0 B在0 B / s)有点奇怪...只是一张支票? 如果我基于第一个maven命令之后的步骤启动一个容器(mvn依

  • 我正在使用sh文件,其中包含所有专家配置,密钥,专家命令。当我运行容器时,它每次都会一次又一次地下载依赖项,它无法缓存依赖项。 下面是我的Dockerfile的外观: 下面是Test.sh文件 当我创建docker映像并运行容器时,每当我运行它时,它就会一次又一次地下载依赖项。

  • 问题内容: 如何在中指定多阶段构建? 对于每个变体(例如dev,prod …),我都有一个包含2个docker文件的多阶段构建: 开发人员:+ 或产品:+ 文件(所有变体通用): 档案: 档案: 没有docker-compose,我可以构建为: 根据compose-file doc,我可以指定要构建的Dockerfile。 但是,如何在其中指定2个Dockerfile (用于多阶段构建)? 问题答

  • 问题内容: 我有一个项目,需要以下Maven jibx插件: 在jibx插件pom内部,有一个xpp3依赖关系,我想从我的项目构建过程中排除它(由于某种原因,我无法在私有存储库中拥有它)。 有没有一种方法可以配置我的pom.xml(而不是插件pom)来排除该依赖关系? 编辑:我试图从插件pom中删除xpp3依赖项,并且该项目可以成功构建,所以我知道依赖项不是强制性的。 问题答案: 这是一个示例,其