【填坑向】我可能也就是踩了dockrfile部署jar包(需读取resource目录下的文件)全部的坑吧。。。

news2024/12/24 2:42:48

FileNotFoundException。。没错、这篇还是从读取的文件找不到的问题开始,今天来个终极版( ̄∇ ̄)/

一开始我把要读取的文件放在了项目根路径,package就没把它打进去,显然是找不到的,于是我把这个JSON文件移到了resources中

此时可以看到,这个文件也打进了target中,这部分可以参考

【填坑向】Linux获取Java程序resource下的文件路径(这次的坑好像没填住……

之前的一篇的文章,那里有记录过获取路径失败的原因,这里就不重复赘述叻

今天这篇是有新发现!算是填上一篇文章的坑( ̄∇ ̄)/

在官网上了解到可以通过解包的方式,来读取jar包中的内容

官方地址:https://docs.spring.io/spring-boot/docs/2.3.12.RELEASE/reference/html/deployment.html#deployment

于是在本地的终端中对打好的jar包依次执行了这两行命令,运行无比顺滑然后我就也在Dockerfile中加了如下红框框内的两行

CMD ["jar","-xf","my-1.0.0-SNAPSHOT.jar"] CMD ["java","org.springframework.boot.loader.JarLauncher"]

推到服务器上。。。就是=[,,_,,]:3哭死在阿里云。。。

报找不到org.springframework.boot.loader.JarLauncher

找不到org.springframework.boot.loader.JarLauncher

最初单纯的俺一直觉得是没有填对路径,于是按照各种文章尝试:比如切换WORKDIR,改绝对路径、改相对路径。。。

服务器日志都是坚持告诉我:Could not find the main class: org.springframework.boot.loader.JarLauncher

即将哭死的我一不小心从旁边大佬处得知CMD指令只有最后一个有效。。。

WHAT?! RUN、CMD 和 ENTRYPOINT 指令都可以用来执行具体的命令RUN 指令是在 Docker 镜像构建时发挥作用, 可以使用多个该命令,且执行结果会记录到镜像中CMD 和 ENTYPOINT 指令是在容器启动时自动执行,均只有最后一个该指令有效,且均可以在 docker run 中被覆盖ENTRYPOINT 指令和 CMD 的区别在于使用 ENTRYPOINT 时 CMD 指令会被作为其默认参数,而用户也可以在启动容器时通过覆盖 CMD 指令来输入参数;此外, 这也意味着 ENTRYPOINT 指令的内容不易被用户命令覆盖。

好吧(谁让我不好好学docker=[,,_,,]:3)

怪不得看到很多案例使都是使用entrypoint.sh文件来执行多条脚本的,俺也来!

于是我在Dockerfile同级目录下新建了一个entrypoint.sh文件,把多条命令写在这个文件中

在Dockerfile中添加执行这个脚本的代码

ENTRYPOINT ["/app/docker/entrypoint.sh"]

又是一顿找不到。。。

no such file or directory

我们先来分析下这个异常记录📝,找不到文件?

我进入到了这个容器的终端中,使用find命令全局搜索🔍,仍然未找到,即不是路径的问题,在我看到ADD xxx.jar那句的时候,忽然意识到,并没有将这个文件复制进镜像,自然不会在启动后能找的到

但是对docker并不是很熟悉的我并不知道这个文件会在具体哪个路径下,算了,成年人不做选择!

全复制!加一行搞定(。・ω・。)ノ

COPY . /app/

就在我好不容易识别到了entrypoint.sh这个文件

它终于开始执行叻。。。。md

permission denied

caused: exec: "/app/docker/entrypoint.sh": permission denied: unknown

一顿搜索🔍主要有两种加权限的方法(如下图1、2)

我用的第二种

容器启动(。・ω・。)ノ

=[,,_,,]:3这个月都没今天哭的次数多、又又又又tmd报错叻!!!》〉冷静ing

算了继续刨错吧。。。

jar: command not found

又报了jar: command not found,明明以前java命令都是可以正常执行(_ _).。o○java命令可以正常执行,但是jar命令不行,这俩明明安装了JDK都会有的呀。。。

我抬头瞅了一眼运维同学提供的基础镜像,我又哭了

请问,这是只装了jre的意思吗?

运维同学:这个基础镜像只提供了运行jar包的基本环境哦,而且按照一般流程是只传jar包到服务器上的(运维同学表示这个锅我不背)

针对这个情况,目前想到的解决方案有两个

解决方案一

引用一个拥有完整JDK的基础镜像

解决方案二

放弃执行jar的解包命令,直接将要读取的文件跟jar包一起COPY到服务器上(这样可以不替换基础镜像,但是需要在代码中判断当前环境,根据不同环境选择不同的路径获取方式)

俺选了方案二,主要不想麻烦运维同学(我真体贴(*≧ω≦)ノ

但是我并不知道这些文件在启动起来的容器中的位置,由于之前用COPY . /app/把target中所有文件都复制了过去,所以我只需要在容器中看下,就知道这些文件的路径了,那么首先我需要把容器启动起来,于是把脚本文件里的代码替换成了单纯启动jar包的

java -server -Xms2048m -Xmx2048m -D java.security.egd=file:/dev./urandom -jar /app/ras-data-1.0.0-SNAPSHOT.jar

果然,容器正常启动了,进入容器后ls查看下,发现果然一句COPY . /app/复制进来了好多东西

再进入docker文件夹看到了我想要执行的脚本文件,但其实已经不重要了,因为俺选了方案二、=_=

然后进入classes文件夹看到了我想要拿路径的JSON文件。。。开心

所以我只需要在Dockerfile里加了如下这一行代码将JSON文件复制到jar包的同目录下

COPY ./target/classes/myJson.json /app/myJson.json

由于按此方案只有一条启动命令需要执行,所以就不需要entrypoint.sh这个脚本文件了,直接在Dockerfile里加即可(其实用的就是原来的启动命令)

ENTRYPOINT ["java","-server","-Xms2048m","-Xmx2048m","-D java.security.egd=file:/dev./urandom","-jar","/app/ras-data-1.0.0-SNAPSHOT.jar"]

Dockerfile成品图如下

启动成功!>> 终于填了之前耿耿于怀的坑坑、今天的花要撒满全世界!(。・ω・。)ノ🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/140940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据智能时代的营销新玩法RTA,你了解吗?|极客星球

近日,由国内知名产品经理社区PMTalk和MobTech联合举办的“从0到1深入产品运营方法论”沙龙活动圆满落幕,MobTech袤博科技开发者平台副总裁陆俊超在会上分享了RTA产品如何全方位提升用户增长效能。 RTA应运而生 在流量红利日益消退的环境下,…

中台KPI怎么设计?

在中台系统建设完毕之后,中台战略在一家企业中的落地工作就算完成了。 此时,我们必须有准确的指标来反映该战略的实际效果,因此就需要对中台战略在企业运作中的效益进行持续化的监测与评估。 行动点: (1&#xff09…

app嵌入新功能,一键接入(内含低代码平台)

在app的开发运营中,有时会需要跟随着用户的使用习惯来进行业务上的更新迭代,比如说新增或删减部分功能,或是调整应用功能布局,优化组件分区,以达到更简洁的效果。那么对应的会有低代码平台提供一些通用组件&#xff0c…

机器学习--决策树、线性模型、随机梯度下降

目录 一、决策树 二、线性模型 三、随机梯度下降 一、决策树 决策树(decision tree):是一种基本的分类与回归方法,此处主要讨论分类的决策树。 在分类问题中,表示基于特征对实例进行分类的过程,可以认为…

带你玩转指针——指针进阶(一)

指针的概念:指针就是变量,用来存放地址指针的大小是固定的4/8个字节(32位平台/64位平台)指针也是有类型的,指针类型决定了-步长,指针解引用时的权限字符指针在前面的学习我们知道了字符指针的初阶应用假如是…

xxljob 调度中心项目 调度一个方法到我们自己的项目,他是咋执行的

目录 1 需求2 实现1 需求 xxljob 调度中心项目 调度一个方法到我们自己的项目,他是咋执行的 2 实现 我们的项目首先是netty 服务器接收到,然后转发到run方法里面 核心就是下面的这个map对象 // 任务启动之后,时间一到就 创建一个 JobThread ,就放到这个priva…

【Linux kernel 文件系统入门及渐进 1 -- sysfs 介绍】

文章目录1.1 Sysfs 介绍1.1.1 kobject 产生背景1.1.2 主要的数据结构1.1.3 数据结构实现1.2 attribute 的功能概述1.2.1 struct attribute 实现1.2.2 attribute 文件的创建1.2.3 attibute 文件的 read 和 write1.1 Sysfs 介绍 Sysfs 是一个基于 RAM 的文件系统,它和…

如何优化.so mmap内存占用

1)如何优化.so mmap内存占用 ​2)模拟器下物理碰撞失效 3)Unity RenderTexture的释放在安卓上并不能使GL内存完全回落 4)数字人中,怎么做到胡子固定在嘴巴皮肤上 这是第319篇UWA技术知识分享的推送。今天我们继续为大家…

docker容器入门介绍

一、什么是docker容器 容器(Container)是基于镜像创建的运行实例,一个容器中可以运行一个或多个应用程序(jdk开发的java应用 程序)。 Docker 可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打…

对外投资数据集

一、2009-2018年各省省际对外非金融类直接投资流量情况数据来源: 中国商务年鉴2、时间跨度:2009-2018年3、区域范围:全国各省份二、2003-2018 OFDI对外直接投资存流量(分国家)与分省份对外直接投资存流量1、…

一个在关键路径上面隐藏了11个月的BUG:DragonOS进程切换查错

前言的前面 DragonOS是一个从0开始研发内核及用户态环境的,独立自主的,面向服务器领域的开源操作系统,提供Linux兼容性。 官网:https://DragonOS.org 代码仓库:GitHub - fslongjin/DragonOS: 一个64位的操作系统。A…

基于jsp+sevlet+mysql实现用户登陆和增删改查功能

基于jspsevletmysql实现用户登陆和增删改查功能一、系统介绍二、功能展示1.用户登陆2.用户列表3.查询用户信息4.添加用户信息5.修改用户信息6.删除用户信息三、其它系统四、获取源码一、系统介绍 系统主要功能: 用户登陆、添加用户、查询用户、修改用户、删除用户 …

用javascript分类刷leetcode4.贪心(图文视频讲解)

什么是贪心算法 贪心法,又称贪心算法,贪婪算法,在对问题求解时,总是做出在当前看来最好的选择,期望通过每个阶段的局部最优选择达到全局最优,但结果不一定最优 适用场景:简单的说,…

手把手YOLOv5输出热力图

环境要求 我的版本是YOLOV5 7.0 先看结果: 结果仅供参考 具体步骤一: 首先配置好YOLO V5环境 这个采用pip install requirements即可 具体配置环境可以看我其他的博客有详细介绍 GPU环境自己配置 步骤二: 运行YOLO 没问题,输…

Excel表格的导入导出——EasyExcel

参考视频 csdn参考地址 一、导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version> </dependency>二、实体类 方式一&#xff1a;Excel Property&#xff08;&…

Kubernetes Pod 底层实现原理

文章目录前言一、探索 Container1.1 设置实验环境&#xff08;playground&#xff09;1.2 探索容器的 namespace1.3 探索容器的 cgroupsCheck the memory limit.二、探索 Pod2.1 设置实验环境&#xff08;playground&#xff09;2.2 探索 Pod 的容器2.3 探索 Pod 的命名空间2.4…

UDP协议重点总结(附实例)

文章目录前言一、网络的原生情况二、UDP协议2.1 UDP的特点2.1.1 不可靠性2.1.2 无连接&#xff08;不是缺点&#xff09;2.1.3 面向数据报&#xff08;优点&#xff09;2.1.4 缓冲区2.1.5 大小受限2.2 UDP协议端格式2.3 关于校验和2.4 基于UDP的应用层协议三、UDP总结&#xff…

P2279 [HNOI2003]消防局的设立

[HNOI2003]消防局的设立题目描述2020 年&#xff0c;人类在火星上建立了一个庞大的基地群&#xff0c;总共有 n 个基地。起初为了节约材料&#xff0c;人类只修建了 n-1 条道路来连接这些基地&#xff0c;并且每两个基地都能够通过道路到达&#xff0c;所以所有的基地形成了一个…

HTML5本地存储详解

html5 本地存储。前言一、localStorage 对象二、sessionStorage 对象三、localstorage 与 cookie 的区别四、localStorage 和 sessionStorage 二者的区别总结前言 ☀️本地存储是指在客户端存储数据&#xff0c;HTML5 为我们提供了两种 API&#xff0c;分别是 localStorage 与 …

算法是如何炼成的?

一、算 法 简 史算法可以追溯到古代埃及人和古希腊人使用的算术方法。在古代埃及&#xff0c;人们使用简单的加减法来解决基本的数学问题&#xff0c;而在古希腊&#xff0c;人们开始使用更加复杂的算术方法&#xff0c;比如平方、立方、平方根和立方根。随着数学的发展&#x…