错误:无效或损坏的 jarfile /bin/sh
Posted
技术标签:
【中文标题】错误:无效或损坏的 jarfile /bin/sh【英文标题】:Error: Invalid or corrupt jarfile /bin/sh 【发布时间】:2021-11-23 00:33:58 【问题描述】:我的 Spring Boot 应用有问题。
如果我 docker-compose up,我会看到这个错误 ->
MongoDb、prometheus 和 grafana 启动正常。
Dockerfile
FROM openjdk:11-jre-slim as build
ADD target/rest-test-0.0.1-SNAPSHOT.jar .
EXPOSE 8000
CMD java -jar rest-test-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-Dspring.profiles.active=prod","-jar"]
docker-compose.yml
version: "3.8"
services:
rest-test:
build: .
restart: always
ports:
- "8000:8080"
depends_on:
- mongo_db
environment:
- "SPRING_PROFILES_ACTIVE=prod"
mongo_db:
image: "mongo:latest"
restart: always
ports:
- "27018:27017"
prometheus:
image: "prom/prometheus"
restart: always
depends_on:
- rest-test
ports:
- "9090:9090"
grafana:
image: "grafana/grafana"
restart: always
depends_on:
- rest-test
ports:
- "3000:3000"
【问题讨论】:
【参考方案1】:ENTRYPOINT
行不适合此处,您应该将其删除。如果确实需要 JVM 选项,请将它们包含在 java
命令中。
CMD java -Dspring.profiles.active=prod -jar rest-test-0.0.1-SNAPSHOT.jar
# no ENTRYPOINT
您会看到原始 Dockerfile 中发生了两件事。由于CMD
是一个裸字符串,Docker automatically wraps it in /bin/sh -c
;并且由于您同时拥有ENTRYPOINT
和CMD
,the CMD
gets passed as arguments to the ENTRYPOINT
。这导致了无意义的命令
java -D... -jar /bin/sh -c 'java -jar rest-test-0.0.1-SNAPSHOT.jar'
这会产生您看到的错误。
不要求图像具有ENTRYPOINT
;在许多情况下,仅指定 CMD
更易于管理(例如,您可以通过 docker run --rm -it your-image sh
在构建的映像上获取交互式调试 shell)。如果您拆分 CMD
和 ENTRYPOINT
,则应编写 ENTRYPOINT
以便它接受完整的命令作为参数,或者 ENTRYPOINT
本身应该是完整的命令并且 CMD
是其参数。
# "Container as command" pattern: lets you
# docker run ... the-image -arg1 -arg2
# where the arguments get passed to the application
ENTRYPOINT ["java", "-Dspring.profiles.active-prod", "-jar", "rest-test-0.0.1-SNAPSHOT.jar"]
CMD []
# empty CMD is optional
# both must be JSON arrays, you do not want the `sh -c` wrapper
【讨论】:
以上是关于错误:无效或损坏的 jarfile /bin/sh的主要内容,如果未能解决你的问题,请参考以下文章
dockerizing Spring Boot 应用程序错误:错误:无效或损坏的 jarfile /app.jar