运行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