Docker部署Java Maven Spring Boot应用镜像构建报错exit code 1求助
报错含义说明
Failed to deploy '<unknown> Dockerfile: Dockerfile': Image build failed with exit code 1 是Docker构建镜像的通用报错,指构建流程中某一步(RUN/COPY等指令)执行返回了非0的错误码,具体是哪一步失败需要结合构建过程的完整日志定位。
常见故障排查步骤
- 检查构建命令是否传入了所有必填参数
你的Dockerfile里定义了三个没有默认值的ARG:MICROSERVICE_NAME、MICROSERVICE_BASE_PATH,构建时必须通过--build-arg传入对应值,否则Maven打包、COPY步骤都会直接失败。
正确的构建命令示例:docker build --build-arg MICROSERVICE_NAME=你的服务名 --build-arg MICROSERVICE_BASE_PATH=服务模块父目录 --build-arg APP_ENV=uat -t 镜像名 . - 检查Maven打包阶段是否报错
你可以先在本地直接执行Dockerfile里的打包命令,验证是否可以正常生成jar包,避免是本身代码依赖、Maven配置的问题:
重点检查打包完成后,mvn clean package -pl :你的服务名 -am -Dmaven.test.skip=true -Puat服务模块父目录/服务名/target/服务名.jar路径是否真实存在,很多时候是模块路径配置错误导致后续COPY阶段找不到文件失败。 - 检查基础镜像可用性
你用到的maven:3.6.3-openjdk-11-slim、openjdk:11.0都是官方镜像,如果没有配置镜像源的话,国内拉取可能超时失败,可以先手动执行docker pull maven:3.6.3-openjdk-11-slim和docker pull openjdk:11.0验证镜像是否能正常拉取。
Dockerfile优化方案
你可以对现有Dockerfile做以下调整,降低出错概率:
FROM maven:3.6.3-openjdk-11-slim as builder ARG APP_ENV=uat ARG MICROSERVICE_NAME # 给MICROSERVICE_BASE_PATH加默认值,避免漏传报错 ARG MICROSERVICE_BASE_PATH=. WORKDIR /app # 优先复制pom文件,利用Docker缓存减少重复下载依赖 COPY pom.xml . COPY ${MICROSERVICE_BASE_PATH}/${MICROSERVICE_NAME}/pom.xml ${MICROSERVICE_BASE_PATH}/${MICROSERVICE_NAME}/ RUN mvn dependency:go-offline -pl :${MICROSERVICE_NAME} -am -Dmaven.test.skip=true -P${APP_ENV} # 再复制代码打包 COPY ./ ./ RUN mvn clean package -pl :${MICROSERVICE_NAME} -am -Dmaven.test.skip=true -P${APP_ENV} FROM openjdk:11.0-jre-slim as runner # 用jre镜像代替jdk镜像,大幅减小最终镜像体积 WORKDIR /root/java_service ARG APP_ENV=uat ARG MICROSERVICE_NAME ARG MICROSERVICE_BASE_PATH=. # 合并RUN指令,减少镜像层 RUN mkdir -p ${APP_ENV} logs COPY --from=builder /app/${MICROSERVICE_BASE_PATH}/${MICROSERVICE_NAME}/target/${MICROSERVICE_NAME}.jar ${APP_ENV}/${MICROSERVICE_NAME}.jar ENV APP_JAR_PATH=/root/java_service/${APP_ENV}/${MICROSERVICE_NAME}.jar # 兼容shell变量解析,保证Java进程能收到系统信号 ENTRYPOINT ["sh", "-c", "java -server -jar ${APP_JAR_PATH}"]
内容的提问来源于stack exchange,提问作者ced_d0llars
相关产品推荐
相关产品推荐

