运行docker容器时报错 exec user process caused "no such file or directory"
现象
Docker镜像正常打包编译(docker build)之后,在Linux环境下启动(docker run)时报错,
错误日志为: standard_init_linux.go:228: exec user process caused: no such file or directory
。
原因
这是由于编码环境是Windows系统,而容器运行或镜像编译环境是Linux系统,换行格式不同造成的,
Windows系统的默认代码格式是dos,而Linux系统的默认代码格式是unix,如果使用dos格式进行代码编写,在编译为docker镜像之后,Docker的启动脚本(例如entry-point.sh
)文本内容的每一行都会被自动添加上一个^W
标识,造成解析错误。
所以在编译前我们需要把代码格式转换一下。
解决
可以在镜像编译前(原始代码中)修改文件格式,也可以在镜像编译后,通过命令行(bash
)对镜像的启动脚本文件内容进行修改。
1.镜像编译前
可以使用代码编辑器(以VScode为例),修改文件格式。在打开文件时,软件右下角会有“选择行尾序列选项”,把CRLF(Windows)
更改为LF(Linux)
就好了。
如图:
2.镜像编译后
可以直接通过bash进入镜像文件目录,然后通过vi修改文件,把^W
等字符删去即可。
也可以安装dos2unix
,使用dos2unix命令把相关文件转换为unix格式。
$ yum install dos2unix
$ dos2unix run-lamp.sh
$ dos2unix Dockerfile
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」