容器中sh脚本明明存在,为何会报"no such file or directory"的错误?
小伙伴碰到一起奇怪的事故,从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插件,显式的体现出每个文件的换行符,这样可以比较直观的察觉到问题。
容器中sh脚本明明存在,为何会报"no such file or directory"的错误?的更多相关文章
- sh脚本异常,binsh^M bad interpreter No such file or directory
错误 在Linux中执行.sh脚本,出现如下异常 /bin/sh^M: bad interpreter: No such file or directory 原因 在windows系统中编辑的.sh文 ...
- windows中修改catalina.sh上传到linux执行报错This file is needed to run this program解决
windows中修改catalina.sh上传到linux执行报错This file is needed to run this program解决 一.发现问题 由于tomcat内存溢出,在wind ...
- stop-hbase.sh出现stopping hbasecat:/tmp/hbase-root-master.pid:No such file or directory
stop-hbase.sh出现stopping hbasecat:/tmp/hbase-root-master.pid:No such file or directory解决办法:在hbase-env ...
- 执行脚本出现bin/bash: bad interpreter: No such file or directory
-bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory VI打开文件,没发现任何问题, 把/bin/bash ...
- 转载:执行脚本出现bin/bash: bad interpreter: No such file or directory
转载网址:http://blog.csdn.net/red10057/article/details/8051650 刚刚学习 SHELL 写了一个简单的例子 发生如下错误 -bash: ./test ...
- 在airflow的BashOperator中执行docker容器中的脚本容易忽略的问题
dag模板 from airflow import DAG from airflow.operators.bash_operator import BashOperator from airflow. ...
- 如何解决jenkins中shell脚本明明执行失败却不自行退出,且构建结果仍然显示success的问题??
首先,需要明确shell命令执行结果$?为0或者非0仅能代表此执行语句是否顺利执行了,例如: 执行语句:adb connect 192.168.XX.XX 执行结果:unable to connect ...
- 【转】执行脚本出现bin/bash: bad interpreter: No such file or directory
[转自]http://blog.csdn.net/wind19/article/details/4822666 错误原因之一很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以/r/n来标识, 其 ...
- ClouderaManager中Event Server报No such file or directory
错误日志如下: 2015-06-24 06:13:10,176 ERROR com.cloudera.cmf.eventcatcher.server.EventCatcherService: Erro ...
- Linux运行shell脚本提示No such file or directory错误的解决办法
Linux执行.sh文件,提示No such file or directory的问题: 原因:在windows中写好shell脚本测试正常,但是上传到 Linux 上以脚本方式运行命令时提示No s ...
随机推荐
- python: ImportError: cannot import name '_unicodefun' from 'click'
报错 报错原因 click模块版本问题 解决方案 指定click版本为8.0.4 参考链接 https://github.com/psf/black/issues/2964
- Java中,在不知道Key的情况下,用多种方法完成一个Map类型的遍历
方法如下: 1.可以用迭代器来遍历, // 获取迭代器 Iterator<String> it = map.iterator().iterator(); // 输出集合中的所有元素 whi ...
- P1880 [NOI1995] 石子合并 题解
区间DP. 首先将其复制一遍(因为是环),也就是经典的破环成链. 设 \(f[i][j]\) 表示将 \(i\) 到 \(j\) 段的石子合并需要的次数. 有 \[f[i][j] = 0(i = j) ...
- TCP四次挥手会经历这么多状态
TCP三次握手 中讲述了序列号和建立连接,这一篇来说说释放连接. 标志位 TCP首部中在属性标志位,和建立连接.释放连接有关,位于保留和窗口字段中间,其中三个标识与断开连接有关. ACK: ackno ...
- 基于 ASP.NET 的投票系统
OnlineVoting 基于 ASP.NET 的投票系统 功能页面 登录 注册 首页 投票广场 查看别人发布的投票. 个人中心 个人资料 换头像.修改密码和其他信息. 发布投票 项目地址:https ...
- 华为云GaussDB(for Influx)单机版上线,企业降本增效利器来了
本文分享自华为云社区<华为云GaussDB(for Influx)单机版上线,企业降本增效利器来了>,作者:GaussDB 数据库 . 1.背景 华为云GaussDB(for Influx ...
- Java日志框架的依赖设置备查(SLF4J, Log4j, Logback)
前言 最近在看代码的过程中,发现身边的许多人在使用Java日志框架时,对于应该引入何种依赖不甚了解,搜索网络上的文章,常常也是互不一致.这篇文章可以看着是Java日志框架的入门使用和实践建议,重点介绍 ...
- AI绘画| 迪士尼风格|可爱头像【附Midjourney提示词】
Midjourney案例分享 图片预览 迪士尼风格|可爱头像 高清原图及关键词Prompt已经放在文末网盘,需要的自取 在数字艺术的新时代,人工智能绘画已经迅速崭露头角.作为最先进的技术之一,AI绘画 ...
- Kafka与RabbitMQ
一.什么是kafka,什么是rabbit Kafka是由Scala语言开发的一种分布式流处理框架,主要用于处理活跃的流式数据,以及大数据量的数据处理.它采用发布-订阅模型,支持消息的批量处理,数据 ...
- Solution -「BalticOI 2004」Sequence
Description Link. Given is a sequencen \(A\) of \(n\) intergers. Construct a stricly increasing sequ ...