将jmx_prometheus_javaagent加入JIB构建时报JAR manifest缺失错误如何解决
问题根因与解决方案
核心配置缺失
你编写的copyJmxPrometheusJavaAgent任务仅把agent包和配置文件复制到了本地构建目录$buildDir/jib-extra下,但是没有配置JIB将该目录的内容同步到最终镜像的文件系统中,导致镜像内根本不存在/srv/jmx_prometheus_javaagent-0.16.1.jar文件,触发文件打开失败、manifest缺失的报错。
完整修复配置
修改你的build.gradle.kts配置,新增JIB的extraDirectories规则,同时修正子项目对根项目变量的引用逻辑:
val jibExtraDir = file("$buildDir/jib-extra") val jibAppRoot = "/srv" // 向子项目暴露全局变量 ext.set("jibAppRoot", jibAppRoot) ext.set("jibExtraDir", jibExtraDir) val copyJmxPrometheusJavaAgent by tasks.registering(Copy::class) { val jarName = "jmx_prometheus_javaagent-0.16.1.jar" val configName = "jmx_prometheus_config.yaml" from("${project.projectDir.absolutePath}/resources/jmx-prometheus") into("$jibExtraDir/$jibAppRoot") doLast { // 兼容可复现构建要求 file("$jibExtraDir/$jibAppRoot/$jarName").setLastModified(0) file("$jibExtraDir/$jibAppRoot/$configName").setLastModified(0) } } subProjects { plugins.withType<JibPlugin>().configureEach { container { jvmFlags = listOf( "-javaagent:${rootProject.ext.get("jibAppRoot")}/jmx_prometheus_javaagent-0.16.1.jar=8099:${rootProject.ext.get("jibAppRoot")}/jmx_prometheus_config.yaml" ) // 可选:如果需要对外暴露metrics端口可放开以下配置 // ports = listOf("8080", "8099") } // 新增:将本地jib-extra目录的内容同步到镜像根路径 extraDirectories { paths { path(rootProject.ext.get("jibExtraDir") as File) { into = "/" } } } tasks.withType<JibTask> { dependsOn(rootProject.tasks.named("copyJmxPrometheusJavaAgent")) } } }
验证方法
构建镜像后执行以下命令确认文件已正确打入镜像:
docker run --entrypoint ls <你的镜像地址> /srv
如果输出包含jmx_prometheus_javaagent-0.16.1.jar和jmx_prometheus_config.yaml即代表配置生效。
其他排查点
- 确认本地
resources/jmx-prometheus目录下的jar包完整,可重新下载官方版本替换损坏的本地文件 - 确认JIB使用的基础镜像运行用户对
/srv目录有可读权限
内容的提问来源于stack exchange,提问作者rishav
相关产品推荐
相关产品推荐

