【问题标题】:Docker layers with Maven versioning使用 Maven 版本控制的 Docker 层
【发布时间】:2021-04-28 09:28:32
【问题描述】:

我对 dockerizing Java/Spring Boot/Maven 应用程序以使用 docker 层的正确流程有疑问。

目前看起来像这样 -> Maven 更新版本(使用 maven 发布插件) -> docker 镜像正在使用自定义 dockerfile 构建。

但是问题是,每次都会下载所有依赖项(即使没有修改 pom,因为我要构建的每个新版本在 pom 中都有不同的版本值(它正在使用此插件进行更新)。

我想使用 docker 层,这样我们的构建可以比现在更快。有可能这样做吗?如果是,怎么做?我应该使用不同的插件还是应该考虑其他选项(也许整个流程很糟糕,应该以不同的方式完成?)

【问题讨论】:

  • 为什么每次都下载依赖?您是否在容器内构建并且没有安装缓存?另外,为什么不简单地使用结果(spring boot 应用程序)并将其仅复制到容器中?
  • 我们有多阶段 dockerfile,它打包应用程序然后复制 jar 文件。打包应用程序的阶段是有问题的,因为它会下载所有必要的依赖项才能构建应用程序。
  • 如前所述,需要缓存,如果您在容器内构建(我通常会阻止)并最终将最终 jar 复制到 docker 时不将其挂载到 docker 映像中图片...如果您想阻止下载,则必须将缓存安装到您的 docker 容器中
  • 我会测试并返回结果;)

标签: java spring-boot docker maven microservices


【解决方案1】:

一种可能性是设置一个本地代理,例如 Nexus 或 Artifactory 实例,您可以使用它来缓存来自互联网的内容。您仍然会下载它们,但希望下载速度会更快。

您可以做的第二种可能性是通过将内容下载到本地存储库(在 Docker 映像中)来创建 Docker 层,然后进行 Docker 构建。所以它看起来像:

RUN mvn dependency:go-offline

RUN mvn build

这样,您的 docker 映像将捕获本地 ~/.m2/repository 缓存中的所有依赖项和插件,然后构建将在本地解析它们。当您重新运行构建步骤时,它应该继承之前的层。

随着项目的发展,您需要随着时间的推移重新构建依赖集,但它会通过不再需要它们来加快构建速度。

您可能希望最后一步从构建的内容创建新的运行时 Docker 映像,而不是依赖此层来处理所有生产内容。

您可能想看看 David Delabasee 去年在伦敦 QCon 上的演讲:

https://www.infoq.com/presentations/openjdk-containers/

【讨论】:

  • 我试图在 docker 中使用多阶段构建,但没有成功。所以我还是应该先复制 pom,然后运行 ​​mvn dependency:go-offline 对吗?但是,即使 pom 中的应用程序版本发生了变化,它仍然可以工作吗? -> 文件已更改,所以我认为 docker 不会使用最后一层 - 我错了吗?
  • 你需要先做一个依赖离线,它会下载你所有的内容。如果您随后添加其他依赖项或插件,它们将照常下载。随着集合的增加,您可能希望更新 Dockerfile 以再次强制重新构建依赖项,但您无需定期执行此操作。但是有 mvn 依赖:在一个 RUN 中脱机,然后在另一个 RUN 中构建 mvn,然后如果你愿意,可以在之后进行最终的复制到展平图像。
  • 好的,知道了。最后一个问题 - 这也适用于我们有其他子模块依赖项的多模块 maven 项目(每次都会增加它们自己的版本)。
【解决方案2】:

我建议将本地 maven 存储库作为卷挂载并在 Docker 映像中使用它,或者使用特殊的本地存储库 (/usr/share/maven/ref/),其内容将在容器启动时复制。

官方 Maven Docker 镜像 (click here) 的文档也指出了实现更好地缓存依赖项的不同方法。

【讨论】:

  • 我会检查的!感谢您的帮助
  • 你应该使用/root/.m2 而不是/usr/shared/maven/ref/ 用于设置配置等​​。
猜你喜欢
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
相关资源
最近更新 更多