fabric8 Maven插件inline assembly致JAR未入Docker镜像
问题定位与解决方案
核心问题触发点
日志输出的[WARNING] DOCKER> Dockerfile /load-testing/Dockerfile does not contain an ADD or COPY directive to include assembly created at maven. Ignoring assembly.就是所有现象的直接原因:
- fabric8 Maven Docker 插件在配置了自定义Dockerfile的场景下,不会自动将inline assembly生成的文件纳入镜像构建流程
- 你在
target/docker/目录下看到的JAR包,只是插件预生成的构建上下文临时文件——因为Dockerfile中没有对应指令触发这些文件的拷贝,它们从未被打进最终的Docker镜像层,因此容器内对应路径下找不到目标文件。
核心疑问明确解答
- 是否必须手动编写COPY指令?
在当前使用自定义Dockerfile的场景下,是必须的。 - 这个能力不是fabric8插件内置提供的吗?
插件的自动文件拷贝能力仅在不使用自定义Dockerfile、采用插件默认镜像构建规则的场景下生效;一旦你在插件配置中指定了自定义Dockerfile路径,插件会完全遵循你编写的Dockerfile逻辑,不再自动注入与assembly相关的COPY指令。 - 当前inline assembly配置存在错误吗?
你的assembly规则没有语法或逻辑错误,只是配置的使用场景和构建模式不匹配。
具体修复步骤
- 明确插件生成的assembly目录结构
插件预生成的assembly文件会被存放在Docker构建上下文的maven/子目录下,目录结构完全对应你assembly中定义的容器目标路径(仅去掉路径开头的斜杠)。
你当前定义的JAR输出路径是/opt/apache-jmeter-5.1.1/lib,因此实际生成的目录结构为:
maven/ └── opt/ └── apache-jmeter-5.1.1/ └── lib/ ├── activemq-all-<版本号>.jar └── json-<版本号>.jar
- 在自定义Dockerfile中添加COPY指令
在Dockerfile中加入一行拷贝指令:
COPY maven/ /
这行指令会把maven/目录下的所有文件,按照原有目录结构拷贝到容器根路径下,刚好匹配你定义的JAR存放路径。
3. 替代实现方案
如果不想手动编写COPY指令,可以移除插件配置中指定的自定义Dockerfile路径,直接在fabric8插件的配置项中声明基础镜像、启动命令等镜像构建参数。这种场景下插件会自动将inline assembly的内容按照定义的输出目录打入镜像,无需额外编写Dockerfile指令。
常见踩坑提醒
- 只要插件配置中通过
<dockerFile>标签指定了自定义Dockerfile路径,就会触发上述“不自动注入assembly COPY指令”的逻辑,与assembly配置本身无关。 - COPY指令的源路径必须与警告信息中提到的assembly目录名保持一致,即
maven/,不要随意修改这个默认路径。
内容的提问来源于stack exchange,提问作者ahoffer
相关产品推荐
相关产品推荐

