【问题标题】:How to solve reducing maven download dependencies time when using docker to build a maven project?使用docker构建maven项目时如何解决减少maven下载依赖时间的问题?
【发布时间】:2019-09-04 09:30:04
【问题描述】:

我已经构建了常见的mavne依赖作为基础docker镜像,但是当我构建一个项目Dockerfile时,它仍然会下载依赖,这需要很长时间才能构建。

【问题讨论】:

  • 运行您自己的 Nexus/Artifactory 服务器来管理和缓存依赖项。

标签: maven docker


【解决方案1】:

maven-dependency-pluginmaven's offline mode 的目标go-offlinedocker multistage builds 结合起来。

参考Dockerfile 可以是:

# Step : Test and package
FROM maven:3.5.3-jdk-8-alpine as builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline

COPY src/ /build/src/
# -o flag will instruct maven to build on offline mode
RUN mvn -o package

# Step : Package image
FROM openjdk:8-jre-alpine
EXPOSE 4567
CMD exec java $JAVA_OPTS -jar /app/my-app.jar
COPY --from=builder /build/target/*jar-with-dependencies.jar /app/my-app.jar

调用dependency:go-offline 将在容器的本地存储库中获取所需的工件。感谢 docker 层缓存,这一步将被缓存,因此在新的构建尝试中将被跳过。

一个重要的注意事项是,复制 pom.xml 应该先于源代码复制,因为对 pom.xml 的更改必须触发新的 maven 工件拉取,因为项目的依赖项可能已更改。

Reference

编辑:请注意,根据您的pom.xml,您可能会遇到open Maven Dependency plugin issue,在该open Maven Dependency plugin issue 上,某些依赖项未从go-offline 目标中获取应该 ,导致构建失败。作为一种解决方法,您可以尝试Romain's answer

【讨论】:

  • 首先,感谢您的回答。我试过你的建议,我只是修改了src,而不是pom.xml,但是当命令运行到“RUN mvn dependency:go-offline”时,每次构建依赖的时间仍然太长,没有使用依赖缓存。你发现这个问题了吗?
  • @Mr.Cao 抱歉耽搁了。我已经更新了我的答案,更新的要点是在mvn package 命令上添加-o 标志和编辑部分的信息。
【解决方案2】:

使用 docker experimental featuresbuildit 您可以在构建过程中挂载(共享)缓存卷,例如:

# syntax = docker/dockerfile:experimental
FROM fabric8/maven-builder
...
RUN --mount=type=cache,target=/root/.m2 mvn versions:set -DnewVersion=1.1.43 && \
    mvn clean install ...

【讨论】:

  • 感谢您的回答。这样,Docker daemon 需要在实验模式下运行。不适合开发。
  • 它不适合特定于您的用例(例如,非常适合我们)。可以使用内置的守护程序配置构建一个 dind 映像,并将其用作您的便携式开发环境。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 2023-03-13
  • 2019-04-11
  • 1970-01-01
  • 2012-08-20
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多