gpt4 book ai didi

java - 如何优化多个相关 Maven Java 项目的 docker 构建? (缓存)

转载 作者:搜寻专家 更新时间:2023-11-01 03:31:24 25 4
gpt4 key购买 nike

我管理着一个大型的专有系统,该系统受到大约 12 个 Java 服务的影响。我们有一组核心的 java 库,这些都共享),并且所有组件/应用程序都是使用 maven 构建的。在核心 SDK jar 之外,尽管每个应用程序都有自己独特的一组依赖项。我不知道在 docker 中构建和部署的最佳方法是什么。理想情况下,我希望整个生命周期都在 docker 中,使用多阶段构建方法。但是,我看不出如何使用大量依赖项对其进行优化。

看来我可以采用两种方法。

  1. 像以前一样构建,使用 maven 和 CI 服务器 (jenkins) 上的公共(public)缓存,以便所有应用程序都可以访问依赖项并缓存一次。然后为每个应用程序创建一个 dockerfile,将产品 jar 及其依赖项(或胖 jar)复制到容器中,并将其设置为执行。这种方法的缺点是构建本身在开发人员和 CI 服务器之间可能有所不同。可能使用像 nexus 这样的本地 Maven 缓存只是为了避免每次都从互联网上拉取 deps?但这仍然不能解决开发构建不一定与 CI 构建环境匹配的问题。

  2. 为每个项目使用多阶段 dockerfile。我试过这个,它确实有效,我设法让 Maven 依赖层缓存起来,这样它就不会太频繁地获取。不幸的是,每个应用程序的中间构建层达到 1-2gb,我无法从守护程序中删除“悬空”中间层,否则所有缓存都会被吹走。这也意味着如果 poms 中发生某些变化,则必须为每个应用程序下载 jar 中的大量重复项。 (即它们都使用 junit 和 log4j 以及许多其他相似之处)

有没有一种我没有看到的最佳解决方法?我发现的所有博客基本上都关注上面的两种方法(有些关注在容器中运行 maven 本身,这对我来说真的没有解决任何问题)。如果没有任何其他好的解决方案,我可能需要最终选择选项 1。

我查看了 stackoverflow 和博客,我能找到的所有内容似乎都假设您真的只是在构建一个应用程序,而不是一组应用程序,在这种情况下,不要重复依赖项下载变得很重要。

最佳答案

我认为只要在 Maven 构建中设置 --update-snapshots 选项就可以使用 .m2/repository 文件系统缓存。它的扩展性更好,因为每个构建环境只缓存每个 .jar 一次,而不是每个应用程序缓存一次。此外,单个依赖项的更改不会使整个缓存失效,如果您使用 docker-layer-caching 就会出现这种情况。

不幸的是,目前无法与多阶段构建很好地结合,但您并不是唯一一个要求它的人。 This issue请求将 --volume 选项添加到 docker build 命令。 This one要求在 Dockerfile 中允许这样的指令:RUN --mount=m2repo=/var/mvn/repo mvn install

这两个功能都允许您在多阶段构建期间使用本地 maven 文件系统缓存。

目前我建议保留选项 1 作为解决方案,除非您面临许多由于构建环境不同而导致的问题。

关于java - 如何优化多个相关 Maven Java 项目的 docker 构建? (缓存),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52798237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com