Java 基于Maven结果构建不同的Docker图像(与Jenkins一起)

Java 基于Maven结果构建不同的Docker图像(与Jenkins一起),java,docker,maven,jenkins,jar,Java,Docker,Maven,Jenkins,Jar,我有一个Java应用程序,它有很多依赖项,我想将其拆分为多个Docker映像: 以代理nginx、JVM和数据库驱动程序为核心->几乎没有变化 依赖项:我的应用程序所依赖的所有Jar文件->有时会发生更改 应用程序:一个额外的Jar->在开发过程中每天更改一次或多次 大致如下: 我知道如何手动构建这些Docker映像。我还可以在maven中创建docker图像: com.spotify dockerfile maven插件 ${dockerfile maven版本} 预集成测试 违约 建筑 推

我有一个Java应用程序,它有很多依赖项,我想将其拆分为多个Docker映像:

以代理nginx、JVM和数据库驱动程序为核心->几乎没有变化 依赖项:我的应用程序所依赖的所有Jar文件->有时会发生更改 应用程序:一个额外的Jar->在开发过程中每天更改一次或多次 大致如下:

我知道如何手动构建这些Docker映像。我还可以在maven中创建docker图像:

com.spotify dockerfile maven插件 ${dockerfile maven版本} 预集成测试 违约 建筑 推 src/main/docker/dockerfile myprivateregistry.io:5000/reportURL ${project.version} myapp.jar 我想,我可以添加两次插件来构建中间层和顶层

但是,我只想开始中间构建,并且只有在包含所有依赖项Jar的target/libs的内容已经更改了新Jar、新版本的Jar、Jar删除时才开始

我该怎么做


我们目前正在使用Jenkins来运行构建,我倾向于使用maven内部解决方案。

不幸的是,这在maven中是不可能的。 Maven不跟踪过去构建的模块,因此无法知道哪些LIB可能已经被修改。有像maven compiler plugin这样的插件,它会获取源文件的时间戳,并与类文件进行比较以跳过编译,但我怀疑是否有插件可以满足您的要求


但是,总是按照您的建议构建两个图像。只需先构建依赖项映像,然后构建应用程序映像。Docker非常擅长缓存层。这意味着,如果LIB没有更改,它只会从缓存中检索图像。否则它将建立一个新的形象。重要提示:只有当Jenkins上的docker守护进程始终相同时,这才有效。如果你有一个集群Jenkins,将会有很多缓存未命中。但它在总体上仍然可以工作,但任何加速都会丢失。

结果表明,谷歌考虑到了这个问题,并为此创建了一个Maven插件。政府正是这样做的

优点:它可以自动照顾所有层:

资源 依赖关系 密码 缺点:它不使用docker文件,而是在

示例如下所示:

com.google.cloud.tools jib maven插件 ${jib.maven.plugin.version} 一些。基本。图片:最新 目的地图像 ${project.version} src/main/docker/scripts /opt/myapp/scripts /opt/shutdown\u脚本 555 /opt/startup\u脚本 555 使用\u当前\u时间戳 /opt/myapp /opt/myapp/entry_point.sh 80 389 8880 8889 8890 应用程序用户 /本地/数据 包裹 dockerBuild
似乎符合我的需要

对于詹金斯来说,有这样的问题,所以我需要看看詹金斯。作业缓存器可能不会起作用,因为mvn clean将核化文件