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包无效/损坏的错误
- 当你使用exec格式的
- 存在两处冗余配置:
- Dockerfile开头
FROM openjdk:11-jre-slim as build的as build是多阶段构建语法,当前仅单阶段构建无需声明 - ENTRYPOINT中硬编码的
-Dspring.profiles.active=prod与docker-compose.yml中传入的SPRING_PROFILES_ACTIVE=prod环境变量重复,环境变量优先级更高,硬编码无实际作用
- Dockerfile开头
解决方案
二选一即可:
方案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
相关产品推荐
相关产品推荐

