Docker容器startup.sh追加命令后dotnet执行dll报错咨询
问题根因
两个核心问题导致报错:
- 换行符格式不兼容:
startup.sh是在Windows环境下编辑保存的,默认使用了CRLF(\r\n)换行格式,而Linux系统的shell仅识别LF(\n)作为换行符,会把每行末尾的\r(回车控制符)当成命令内容的一部分。
修改脚本前,dotnet ConsoleApp4.dll是文件最后一行,shell会自动忽略文件末尾的孤立\r字符,所以命令能正常执行;追加echo命令后,dotnet命令行末尾的\r被保留,实际传入的dll文件名是ConsoleApp4.dll\r(末尾带不可见回车符),系统自然找不到对应文件。错误输出里的文本错位(' does not exist.tion 'ConsoleApp4.dll)就是\r把输出光标拉回行首、覆盖了前面输出内容的典型现象。 - 脚本shebang声明错误:脚本第一行写的是
#!/bin,而bash解释器的实际路径是/bin/bash,属于不规范写法,当前因为ENTRYPOINT显式调用bash startup.sh所以没触发这个问题,但属于潜在隐患。
修复方案
按以下步骤操作即可解决:
- 转换脚本换行格式:将
startup.sh的换行格式从CRLF切换为Linux兼容的LF格式- 用VS Code等编辑器修改的话,点击窗口右下角的换行格式标识,选择
LF后保存即可 - 已经上传到Linux环境的话,直接执行
sed -i 's/\r$//' startup.sh就能批量清除所有行尾的\r字符
- 用VS Code等编辑器修改的话,点击窗口右下角的换行格式标识,选择
- 修正shebang声明:把脚本第一行的
#!/bin改为#!/bin/bash - 修正后的完整
startup.sh内容如下:
#!/bin/bash echo "Starting dot net console app" dotnet ConsoleApp4.dll echo "Completed execution"
- 重新执行
docker build构建镜像,再启动容器就可以正常运行,dotnet命令执行完成后会正常打印Completed execution。
内容的提问来源于stack exchange,提问作者Silly John
相关产品推荐
相关产品推荐

