如何优化多个相关maven java项目的docker构建?(缓存)
我管理一个大型的property系统,该系统由大约12个java服务组成。我们有一组核心的java库,这些库都是共享的),所有组件/应用程序都是使用maven构建的。在核心SDK JAR之外,每个应用程序都有自己独特的依赖项集。我不知道在docker内部构建和部署的最佳方法是什么。理想情况下,我希望整个生命周期都在docker中,使用多阶段构建方法。但是,我看不出如何在有大量依赖项的情况下对此进行优化 看起来我可以做两种方法如何优化多个相关maven java项目的docker构建?(缓存),java,maven,docker,Java,Maven,Docker,我管理一个大型的property系统,该系统由大约12个java服务组成。我们有一组核心的java库,这些库都是共享的),所有组件/应用程序都是使用maven构建的。在核心SDK JAR之外,每个应用程序都有自己独特的依赖项集。我不知道在docker内部构建和部署的最佳方法是什么。理想情况下,我希望整个生命周期都在docker中,使用多阶段构建方法。但是,我看不出如何在有大量依赖项的情况下对此进行优化 看起来我可以做两种方法 按照我们之前的方式构建,使用maven和CI服务器(jenkins)上
我查看了stackoverflow和博客,我能找到的一切似乎都认为你只是在构建一个应用程序,而不是一套应用程序,重要的是不要重复依赖项下载。我认为只要在maven构建中设置
--updatesnapshots
选项,就可以使用.m2/repository文件系统缓存。它可以更好地扩展,因为每个.jar在每个构建环境中只缓存一次,而不是在每个应用程序中缓存一次。此外,单个依赖项中的更改不会使整个缓存失效,如果使用docker层缓存,则会出现这种情况
不幸的是,目前还不能很好地将其与多阶段构建结合起来,但您并不是唯一一个要求这样做的人。
请求向docker build命令添加--volume
选项。要求在Dockerfile中允许这样的指令:RUN--mount=m2repo=/var/mvn/repo-mvn-install
这两个特性都允许您在多级构建期间使用本地maven文件系统缓存
目前,我建议保留选项1作为解决方案,除非您面临许多由于构建环境不同而导致的问题。我是否理解这句话:
像以前一样构建,使用maven和CI服务器(jenkins)上的公共缓存,以便一次获取依赖项并进行缓存,而且所有的应用程序都可以正常访问
,这样你就可以用一个缓存来处理你所有的Jenkins工作了?哈,我感觉我进入了一片泥潭。是的,这些jenkins作业都共享一个公共的.m2/存储库位置。jenkins实例只为这个系统构建软件,所有组件都是相互关联的。