Docker构建执行mvn package报错exit code:1,求技术支持
Maven打包失败(exit code 1)的Docker镜像构建排查方案
问题描述
构建Java项目Docker镜像时,执行mvn package步骤报错退出,日志被截断无法看到具体错误:
#0 992.9 [output clipped, log limit 1MiB reached] failed to solve: executor failed running [/bin/sh -c mvn package]: exit code: 1
已调整Docker Desktop Engine配置,问题仍未解决。使用的Dockerfile代码如下:
FROM maven:3.6.3-jdk-11-slim AS build WORKDIR usr/src/app COPY . ./ RUN apt-get update && apt -y upgrade RUN mvn package FROM tomcat:8.5-jdk8 ARG JAR_NAME="Builder" COPY DMClient.properties /usr/local/tomcat/bin COPY DMLogin.war /usr/local/tomcat/webapps COPY mssql-jdbc-6.4.0.jre8.jar /usr/local/tomcat/lib COPY DMClient.xml /usr/local/tomcat/conf/Catalina/localhost/ COPY DMLogin.xml /usr/local/tomcat/conf/Catalina/localhost/ COPY DMLogin.properties /usr/local/tomcat/bin COPY sqljdbc_auth.dll /opt/java/openjdk/lib WORKDIR /usr/src/app ADD /*.war /DMClient.war COPY --from=build /usr/src/app/target/*.war /usr/local/tomcat/webapps CMD ["catalina.sh", "run"]
排查步骤
1. 先获取完整的Maven构建日志
日志被截断是核心障碍,先拿到完整错误信息才能定位问题:
- 构建时添加
--progress=plain参数,强制输出未截断的日志:docker build --progress=plain -t your-image-tag . - 也可以直接在本地项目目录执行
mvn package,看是否能复现错误,先排除Docker环境外的代码或依赖问题。
2. 修复Dockerfile中的路径错误
- 构建阶段的
WORKDIR usr/src/app缺少根目录斜杠,会在默认根目录/下嵌套创建usr/src/app,导致路径混乱,改为:WORKDIR /usr/src/app - 最终阶段的
ADD /*.war /DMClient.war路径错误,/*.war会匹配根目录下的war包,而当前WORKDIR是/usr/src/app,改为ADD *.war /DMClient.war,或者直接删除这一步(因为后面已经从build阶段复制了target下的war包,这步大概率冗余)。
3. 优化Maven构建环境
- 删掉
RUN apt-get update && apt -y upgrade:maven:3.6.3-jdk-11-slim是轻量镜像,系统更新没必要,反而可能破坏现有环境导致构建失败。 - 检查依赖下载问题:如果项目依赖私有仓库或需要外网访问,构建时可能因网络失败。可以提前在本地执行
mvn dependency:go-offline下载依赖,或者在Dockerfile中添加Maven代理配置。 - 跳过测试快速验证:打包时添加
-DskipTests参数,先排除测试用例失败导致的打包问题:RUN mvn package -DskipTests
4. 检查JDK版本兼容性
构建用的是JDK11,最终运行环境是Tomcat8.5-jdk8(JDK8),如果项目代码使用了JDK11专属特性,后续运行会报错,但当前是打包阶段失败,先确认打包时JDK11环境是否正常编译代码。
5. 优化构建缓存,提前发现依赖问题
调整Dockerfile顺序,先复制pom.xml下载依赖,再复制代码,这样依赖缓存不会因代码修改失效,也能提前排查依赖问题:
FROM maven:3.6.3-jdk-11-slim AS build WORKDIR /usr/src/app # 先复制pom.xml下载依赖 COPY pom.xml ./ RUN mvn dependency:go-offline # 再复制所有代码 COPY . ./ RUN mvn package -DskipTests
内容的提问来源于stack exchange,提问作者Abhi Chawla
相关产品推荐
相关产品推荐

