現象
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