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

文章目录

1.问题描述

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

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

shell 复制代码
# 映射 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

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

2.问题分析

我们先查看一下日志:

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

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

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

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

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

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

shell 复制代码
# 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
-v mysql:/var/lib/mysql

# 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录
-v ./mysql:/var/lib/mysql

3.问题解决

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

  • 绝对路径方式

    shell 复制代码
    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
  • 相对路径方式

    shell 复制代码
    # 需要保存当前执行命令所在位置是在 /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

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

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

shell 复制代码
# -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

会报错:invalid mount config for type "bind": invalid mount path: 'app.jar' mount path must be absolute.

相关推荐
hrrrrb5 分钟前
【Spring Boot 快速入门】一、入门
java·spring boot·后端
一位搞嵌入式的 genius7 分钟前
暑期自学嵌入式——Day10(C语言阶段)
linux·笔记·学习·嵌入式c语言
被遗忘的旋律.10 分钟前
Linux驱动开发笔记(五)——设备树(上)
linux·驱动开发·笔记
超级小忍1 小时前
Spring Boot 配置文件常用配置属性详解(application.properties / application.yml)
java·spring boot·后端
麦兜*1 小时前
基于Spring Boot的审计日志自动化解决方案,结合SpEL表达式和AOP技术,实现操作轨迹自动记录,并满足GDPR合规要求
java·jvm·spring boot·后端·spring·spring cloud·maven
青云交2 小时前
Java 大视界 -- Java 大数据机器学习模型在金融信用评级模型优化与信用风险动态管理中的应用(371)
java·大数据·机器学习·信用评级·动态风控·跨境金融·小贷风控
先生沉默先2 小时前
Docker学习日志-Docker容器配置、Nginx 配置与文件映射
学习·nginx·docker
conkl3 小时前
构建 P2P 网络与分布式下载系统:从底层原理到安装和功能实现
linux·运维·网络·分布式·网络协议·算法·p2p
求知若渴,虚心若愚。4 小时前
Error reading config file (/home/ansible.cfg): ‘ACTION_WARNINGS(default) = True
linux·前端·ansible
二哈喇子!5 小时前
若依【(前后端分离版)SpringBoot+Vue3】
java·spring boot·后端