首页 > 其他分享 >容器中sh脚本明明存在,为何会报"no such file or directory"的错误?

容器中sh脚本明明存在,为何会报"no such file or directory"的错误?

时间:2023-11-15 19:23:13浏览次数:612  
标签:脚本 容器 no sh 报错 file bin 换行符

小伙伴碰到一起奇怪的事故,从gitlab上拉取的docker镜像项目,在本地开发机上进行docker build后,启动容器会报错如下:

exec /app/run.sh : no such file or directory

 /app/run.sh文件是ENTRYPOINT启动的,注释掉ENTRYPOINT,直接进入容器后可以看到 /app/run.sh好好在那儿,文件的可执行权限也没有问题。那么问题在哪里?

 

其实这个问题很简单,但由于容器启动时的错误信息不全,产生了误导,让人误以为找不到sh脚本文件。

 

如果先启动容器,在容器内再手工执行 /app/run.sh,会看到报错信息略有不同。实际报错的是sh脚本的第一句:

#!/bin/bash

 那么是因为容器内缺失 /bin/bash解释器吗?也不是,基础镜像没有问题,/bin/bash好好的存在。

最关键的是,同样的git项目拉取到的sh脚本和Dockerfile在另外一台开发机上进行镜像编译和运行是没有问题的。

 

仔细观察,发现sh脚本文件在不同的机器上,有一点点不同:换行符。

出问题的开发机上,脚本换行符是Windows换行符CRLF,所以这个脚本进入Docker容器中,第一行变成了:

#!/bin/bash【看不见的CRLF】

 那执行脚本的时候,LF会被认为是Linux换行符,而解释器名称就成了”/bin/bashCR“,肯定找不到,所以就会报错"no such file or directory"。

这个报错的真实含义是”找不到脚本的解释器“,而不是找不到脚本本身。

 

那么为什么脚本文件的换行符被改变为CRLF呢,其实是git的core.autocrlf特性搞的鬼。参考 https://blog.upx8.com/3184

为了避免这种问题,有两个建议:
1,所有的开发机上,统一git的autocrlf设置,避免其为true。

2,VSCode上安装code-eol插件,显式的体现出每个文件的换行符,这样可以比较直观的察觉到问题。

 

标签:脚本,容器,no,sh,报错,file,bin,换行符
From: https://www.cnblogs.com/csliwei/p/17834553.html

相关文章

  • 2023NOIP停课集训总结
    2023NOIP停课集训总结​ 距离十八次的NOIP模拟赛结束只剩下三四天了,NOIP也将在11.18周六如期举行。​ 在这次从2023.10.1至2023.11.18的集训中,我确实有了许多收获,感到自己的知识经验积累更加丰富。​ 下面我将从几个方面对此次集训进行总结。1.知识点的收获分块分块是一种......
  • Error: Component series.liquidFill not exists. Load it first.
    Error:Componentseries.liquidFillnotexists.Loaditfirst. 场景:使用水球图时,报错:Error:Componentseries.liquidFillnotexists.Loaditfirst.解决办法:1、先检查是否安装了echarts和echarts-liquidfill(注:echarts4.+的版本对应echarts-liquidfill2.+的版本)npmin......
  • 2023/11/15 NOIP 模拟赛
    T1游戏标签尺取线段树单调队列线段树进阶思路抽象题意,相当于有\(t\)个点,有\(n\)个下接\(x\)轴的矩形。首先明显可以按照\(c\)排序,然后尺取。写法线段树记录每区间内未被覆盖的最大高度。因为插入和删除的顺序相对不变,一个单调队列维护该区间内矩形高度即可,若......
  • subject organization is not system:nodes 问题解决
    在下面的issues找到了答案:https://github.com/kubernetes/kubernetes/issues/99504┌──[[email protected]]-[~]└─$kubectlgetcsrNAMEAGESIGNERNAMEREQUESTORREQU......
  • vcpkg install polyclipping:x64-windows Could not locate a manifest (vcpkg.json)
    错误信息表明vcpkg在当前工作目录及其父目录中找不到vcpkg.json文件,因此无法确定要安装的库。这可能是因为你执行vcpkginstall命令的位置不在包含vcpkg.json文件的项目目录中。以下是解决方法:确保在包含vcpkg.json的项目目录中运行命令:打开一个命令行终端。切......
  • 在Dash中更灵活地编写回调函数
    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master大家好我是费老师,使用Dash开发过交互式应用的朋友,想必都不会对回调函数感到陌生,作为Dash应用中实现各种交互逻辑的“万金油”方式,不管是常规的@app.callback(),还是对应浏览器端回调的app.clientsid......
  • 《全网最细-深度解析 Istio Ambient Mesh 流量路径》摘要
    ----NodeA首次上行--------APREROUTING-jztunnel-PREROUTING-Aztunnel-PREROUTING-ptcp-mset--match-setztunnel-pods-ipssrc-jMARK--set-xmark0x100/0x100-Aztunnel-PREROUTING-mmark--mark0x100/0x100-jACCEPTfromallfwmark0x100/0x100lookup101101......
  • chrome浏览器报Cannot read properties of undefined (reading 'getUserMedia')
    chrome访问摄像头的时候可能报这个错误。使用https协议可以解决这个问题,如果不能使用https可以通过修改chrome配制解决。在chrome地址栏输入chrome://flags/#unsafely-treat-insecure-origin-as-secure在Insecureoriginstreatedassecure的输入框输入要打开网页的地址如http......
  • shell 同时获取两个入参数
    其实在shell里,无法同时获取两个参数入参,需一点其他的whileread-rlinedoecho$linestr1=`echo$line|awk'{print$1}'`echo$str1str2=`echo$line|awk'{print$2}'`echo$str2kubectldeletepod-n$str1$str2--force--grace-period=0done</tmp/Termi......
  • 在Java中实现跨域(Cross-Origin Resource Sharing, CORS)
    在Java中实现跨域(Cross-OriginResourceSharing,CORS)主要涉及到在服务器端设置HTTP响应头,以允许来自不同源的客户端请求。下面是一些常用的方法来实现跨域:1.Servlet过滤器你可以创建一个过滤器(Filter)来添加必要的HTTP头。这种方法适用于所有基于Servlet的应用程序,如纯Servlet......