Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优化多个相关maven java项目的docker构建?(缓存)_Java_Maven_Docker - Fatal编程技术网

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

如何优化多个相关maven java项目的docker构建?(缓存),java,maven,docker,Java,Maven,Docker,我管理一个大型的property系统,该系统由大约12个java服务组成。我们有一组核心的java库,这些库都是共享的),所有组件/应用程序都是使用maven构建的。在核心SDK JAR之外,每个应用程序都有自己独特的依赖项集。我不知道在docker内部构建和部署的最佳方法是什么。理想情况下,我希望整个生命周期都在docker中,使用多阶段构建方法。但是,我看不出如何在有大量依赖项的情况下对此进行优化 看起来我可以做两种方法 按照我们之前的方式构建,使用maven和CI服务器(jenkins)上

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

看起来我可以做两种方法

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

  • 对每个项目使用多阶段dockerfile。我已经尝试过了,它确实有效,我设法让maven dependencies层缓存起来,这样它就不会太频繁地获取。不幸的是,每个应用程序的中间构建层达到了1-2gb,我无法从守护进程中删除“悬而未决”的中间层,否则所有的缓存都会消失。这还意味着,如果POM中发生变化,每个应用程序都必须下载大量的JAR副本。(即它们都使用junit和log4j以及许多其他相似之处)

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


    我查看了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实例只为这个系统构建软件,所有组件都是相互关联的。