Windows环境下Docker容器内执行.sh脚本异常,同命令直接运行正常
问题排查与解决方案
根因定位
该问题核心是Windows与Linux类系统的换行符格式不兼容:
你在Windows 10环境下创建的.sh脚本默认使用CRLF(\r\n)作为换行符,而Docker容器内的Linux环境仅识别LF(\n)换行符。脚本末尾多余的\r回车符会被识别为命令参数的一部分,导致Django实际接收到的应用名称为authentication\r,无法匹配到已注册的应用。你看到的截断式异常输出,就是因为\r会让光标回到行首,后续输出内容覆盖了前面的完整报错信息,原始完整报错应为No installed app with label 'authentication\r'。
排查步骤
- 验证换行符问题
在容器内执行命令:cat -A ./migration_script.sh,如果输出的行尾显示^M$,即可确认是换行符格式问题。
修复方案
单次临时修复
直接在容器内转换脚本格式即可:
- 安装dos2unix工具(Debian/Ubuntu系容器):
apt update && apt install -y dos2unix - 执行格式转换:
dos2unix ./migration_script.sh - 重新运行脚本即可正常执行。
永久规避方案
- Git仓库配置:在Windows端执行
git config --global core.autocrlf true,配置Git提交代码时自动将CRLF转为LF,拉取到本地时自动转回CRLF;也可以在项目根目录新增.gitattributes文件,指定所有.sh文件强制使用LF换行符。 - 编辑器配置:使用VS Code、Notepad++等编辑器编写Shell脚本时,手动将右下角的换行符格式从
CRLF修改为LF后再保存。 - 镜像构建配置:在Dockerfile中新增批量转换脚本格式的步骤,构建镜像时自动将所有
.sh文件转为LF格式,避免每次手动处理。
内容的提问来源于stack exchange,提问作者SAIF AHMED ANIK
相关产品推荐
相关产品推荐

