• docker报错问题解决:Error Invalid or corrupt jarfile app.jar


    1.问题描述

    此时处在 /home/ubuntu/app 目录下,并且在该目录下有一个 jenkins-0.0.1-SNAPSHOT.jar。

    image-20231018182036352

    我在 /home/ubuntu/app 目录下执行了 docker 容器运行命令:

    # 映射 8859 端口
    # 容器名为 jenkins-demo
    # 将 jenkins-0.0.1-SNAPSHOT.jar 复制到容器内的 /app.jar
    # 以 jdk11 为容器镜像
    # 执行命令 java -jar /app.jar 运行 java 程序
    docker run -dp 8859:8859 \
    --name jenkins-demo \
    -v jenkins-0.0.1-SNAPSHOT.jar:/app.jar \
    openjdk:11 \
    java -jar /app.jar
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    但遗憾的是,当我执行命令后,并没有运行起来。

    image-20231018182646207

    2.问题分析

    我们先查看一下日志:

    image-20231018182729759

    提示错误信息:Error: Invalid or corrupt jarfile /app.jar

    该错误表示的是 jar 文件无效或损坏,于是我开始考虑是不是 -v 挂载有问题。

    于是我使用 docker inspect jenkins-demo 查看该容器信息,特别是挂载情况。然后查看 Mounts 下的信息:

    image-20231018185125451

    我发现 jenkins-0.0.1-SNAPSHOT.jar 成了数据卷名称,/app.jar 是容器内的目录。

    这时候我才突然想起来,如果在 -v 时直接写个名称,那么 docker 会将它识别为是一个数据卷名称而不是本地文件或目录名。

    🚩 即:本地目录或文件必须以 /./ 开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。例如:

    # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
    -v mysql:/var/lib/mysql
    
    # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录
    -v ./mysql:/var/lib/mysql
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.问题解决

    我们可以将之前的 docker run 命令修改为以下两种方式:

    • 绝对路径方式

      docker run -dp 8859:8859 \
      --name jenkins-demo \
      -v /home/ubuntu/app/jenkins-0.0.1-SNAPSHOT.jar:/app.jar \
      openjdk:11 \
      java -jar /app.jar
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 相对路径方式

      # 需要保存当前执行命令所在位置是在 /home/ubuntu/app 目录下,因为我将 jenkins-0.0.1-SNAPSHOT.jar 就是放在了此目录下
      docker run -dp 8859:8859 \
      --name jenkins-demo \
      -v ./jenkins-0.0.1-SNAPSHOT.jar:/app.jar \
      openjdk:11 \
      java -jar /app.jar
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    这时候我们再使用 docker inspect jenkins-demo 查看数据卷挂载情况和我们希望的一样了:

    image-20231018190925962

    最后,还有一点可以注意,在指定 容器内路径 时必须使用绝对路径,即如果如下写法:

    # -v 挂载时将 /app.jar 修改为 app.jar
    docker run -dp 8859:8859 \
    --name jenkins-demo \
    -v ./jenkins-0.0.1-SNAPSHOT.jar:app.jar \
    openjdk:11 \
    java -jar /app.jar
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20231018190152097

    会报错:invalid mount config for type “bind”: invalid mount path: ‘app.jar’ mount path must be absolute.

  • 相关阅读:
    新生儿吐奶的原因以及处理方法,非常实用(建议收藏)
    Oracle数据如何迁移导入到MySQL
    ffmpeg编译so
    java毕业设计校园实习管理系统mybatis+源码+调试部署+系统+数据库+lw
    购买nft 使用的token 代币有哪些
    离线环境harbor 搭建及使用
    在线制作作息时间表
    基于springboot操作clickhouse进行大数据查询和批量插入
    查看和分析 IIS 日志文件以增强 Web 服务器安全性
    推荐3款卓越的 .NET 开源搜索组件库
  • 原文地址:https://blog.csdn.net/qq_62982856/article/details/133912628