You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot执行docker-compose up报错Invalid or corrupt jarfile /bin/sh如何解决

问题根因
  • 核心诱因是Dockerfile中ENTRYPOINT与CMD的规则冲突,导致最终执行命令组装错误:
    • 当你使用exec格式的ENTRYPOINT ["java","-Dspring.profiles.active=prod","-jar"]时,Docker会自动将CMD的内容作为参数追加到ENTRYPOINT的命令末尾
    • 你配置的CMD为shell格式java -jar rest-test-0.0.1-SNAPSHOT.jar,Docker对shell格式的指令会默认包装为/bin/sh -c "原指令内容"再传入
    • 最终容器实际执行的命令为 java -Dspring.profiles.active=prod -jar /bin/sh -c "java -jar rest-test-0.0.1-SNAPSHOT.jar",Java将首个参数/bin/sh识别为待执行的jar包,因此抛出jar包无效/损坏的错误
  • 存在两处冗余配置:
    • Dockerfile开头FROM openjdk:11-jre-slim as build的as build是多阶段构建语法,当前仅单阶段构建无需声明
    • ENTRYPOINT中硬编码的-Dspring.profiles.active=prod与docker-compose.yml中传入的SPRING_PROFILES_ACTIVE=prod环境变量重复,环境变量优先级更高,硬编码无实际作用
解决方案

二选一即可:

方案1:保留ENTRYPOINT,删除冗余CMD,将jar包路径补全到ENTRYPOINT中

修改后Dockerfile参考:

FROM openjdk:11-jre-slim
ADD target/rest-test-0.0.1-SNAPSHOT.jar .
EXPOSE 8000
# 可删除硬编码的profiles配置,优先使用docker-compose传入的环境变量
ENTRYPOINT ["java","-jar","rest-test-0.0.1-SNAPSHOT.jar"]

方案2:删除ENTRYPOINT,仅保留CMD指令(推荐exec格式避免多余sh进程)

修改后Dockerfile参考:

FROM openjdk:11-jre-slim
ADD target/rest-test-0.0.1-SNAPSHOT.jar .
EXPOSE 8000
CMD ["java","-Dspring.profiles.active=prod","-jar","rest-test-0.0.1-SNAPSHOT.jar"]
额外注意事项

当前docker-compose.yml中rest-test服务的端口映射为8000:8080,与Dockerfile中EXPOSE的8000不一致,请确认Spring Boot应用默认启动端口:

  • 如果应用实际启动端口为8080,配置无误
  • 如果应用实际启动端口为8000,需将端口映射修改为8000:8000

内容的提问来源于stack exchange,提问作者SaseQ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:39:00