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