错误:无效或损坏的 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;并且由于您同时拥有ENTRYPOINTCMD,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)。如果您拆分 CMDENTRYPOINT,则应编写 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

bin/sh^M:损坏的解释器: 没有那个文件或目录

作业帮助,分段错误,双重释放或损坏,free():无效指针

VS下面的编译错误-----转换到 COFF 期间失败: 文件无效或损坏

Java 虚拟机启动器错误:Jar 文件无效或损坏

错误 1 error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 C:UsersAdminist