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

无法缓存docker映像中的maven依赖项

高恺
2023-03-14

我正在使用sh文件,其中包含所有专家配置,密钥,专家命令。当我运行容器时,它每次都会一次又一次地下载依赖项,它无法缓存依赖项。

下面是我的Dockerfile的外观:

#MVN as build tool
FROM docker.hub.com/maven:3.5.3-jdk-8

#Settings.xml for downloading dependencies from nexus repository
ARG MVN_SETTINGS=settings.xml

#Maven project pom
ARG MVN_POM=pom.xml

#Defining the current working repository
WORKDIR /usr/src/app


#Coping the settings.xml into working directory
COPY ${MVN_SETTINGS} settings.xml

#Coping the pom.xml into working directory
COPY ${MVN_POM} pom.xml

#Download the package and make it cached in docker image
RUN mvn -B -f ./pom.xml -s settings.xml dependency:resolve-plugins dependency:resolve


#Coping the source code into working repository
COPY  src .

COPY  Test.sh .

#Execute permission
RUN chmod a+x Test.sh

#Entry point for docker container
CMD ./Test.sh

下面是Test.sh文件

#!bin/bash
mvn test -DtestSuite=src/test/resources/suites/Suite.xml

当我创建docker映像并运行容器时,每当我运行它时,它就会一次又一次地下载依赖项。

共有1个答案

宋斌
2023-03-14

你想要的是不可能的——至少使用“常规”Docker和Dockerfile——参见这个问题以获得解释。

但是,您可以使用实验性的 Dockefile 语法为 RUN 语句启用缓存,从而达到预期的效果:

# syntax = docker/dockerfile:1.0-experimental
FROM docker.hub.com/maven:3.5.3-jdk-8

ARG MVN_SETTINGS=settings.xml
ARG MVN_POM=pom.xml

WORKDIR /usr/src/app

COPY ${MVN_SETTINGS} settings.xml
COPY ${MVN_POM} pom.xml
RUN --mount=type=cache,target=/root/.m2 mvn -B -f ./pom.xml -s settings.xml dependency:resolve-plugins dependency:resolve

COPY src .
COPY Test.sh .
RUN chmod a+x Test.sh
CMD ./Test.sh

上面的泊坞文件将启用 /root/.m2 目录的缓存。该命令仍将每次运行,但依赖项不会重新下载。也就是说,此多克文件将无法与“常规”多克程序一起使用。它需要构建工具包。

我还建议使用 BuildX 插件并使用 docker buildx 构建来构建映像,以便在构建引擎之间轻松切换,而无需设置和取消设置环境变量。

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

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

  • 我有以下文件夹结构: 这里,我的是: 当我运行时,我希望有两个输出图像,一个用于,一个用于。 我使用(仅与版本2的语法兼容)。

  • 我在努力 服务器:版本:1.11.2 API版本:1.23 Go版本:Go1.5.4 Git提交:b9f10c9构建:Wed Jun 1 22:00:43 2016 OS/arch:linux/amd64

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

  • 对于我的一些模块,Intellij的想法不是导入依赖项和插件。只导入活循环。 当我在命令行编译时,POM是有效的。我已经删除了模块并重新导入它们。我删除了他们的项目,并重新导入它。 所以我想知道Intellij在模块上的想法信息被删除后是否有一些秘密缓存。