Docker Desktop在Windows上使用WSL2后端,脚本若含Windows CRLF换行符(\r\n),WSL2中dockerd会将\r误解析为路径字符,导致如"./\r"错误;根本原因是Linux环境只识别LF换行,需用dos2unix、sed或vim转换为Unix格式并配置Git/编辑器预防。

脚本在 Docker Desktop(Windows)里执行报 Error: context must be a directory: "/path/.\r",基本就是换行符惹的祸——文件用了 Windows 的 CRLF(\r\n),而 Linux 容器或 WSL2 环境只认 LF(\n)。
为什么 Docker Desktop 会把 \r 当路径一部分
Docker Desktop 在 Windows 上默认走 WSL2 后端,所有构建命令最终由 WSL2 中的 dockerd 执行。WSL2 是真正的 Linux 环境,它读取 shell 脚本时按 Unix 规范解析换行:遇到 \r\n 就把 \r 当作路径字符塞进参数里,于是 . 变成 .\r,docker build -t app . 就崩成 context must be a directory: "./\r"。
常见触发场景:
- 用 VS Code、Notepad++、Git Bash 等工具在 Windows 上编辑了
build.sh或start.sh,保存时默认用了 CRLF - 从 Windows 共享目录挂载脚本进容器,没做换行符转换
- Git clone 项目后没配
core.autocrlf=input,导致脚本被自动转成 CRLF
快速验证脚本是否带 \r
别猜,直接看:
- 在 PowerShell 或 WSL2 终端里运行:
cat -A your_script.sh - 如果某行末尾显示
^M$,就确认含\r(^M是\r的可视表示) - 正常应只显示
$(纯 LF)
也可以在 VS Code 底部状态栏看右下角:显示 CRLF 就要改,显示 LF 才安全。
三种可靠修复方式(按推荐顺序)
优先选 dos2unix,它专治此病,不误伤其他字符:
- WSL2 里装它:
sudo apt-get install dos2unix -y(Ubuntu/Debian)或sudo yum install dos2unix -y(CentOS/RHEL) - 转格式:
dos2unix your_script.sh - 验证:
cat -A your_script.sh确认^M消失
没装 dos2unix?用 sed 行:
-
sed -i 's/\r$//' your_script.sh(Linux/WSL2 命令) - 注意:Windows Git Bash 里要用
sed -i 's/\r$//' your_script.sh,PowerShell 不认这个语法,别混用
Vim 用户可直接在编辑器里修:
-
vi your_script.sh→ 输入:set ff=unix→:wq - 别用
:set fileformat=unix,缩写ff更稳
预防下次再踩坑
换行符问题不是“修一次就完”,它会在协作中反复出现:
- Git 全局设好:
git config --global core.autocrlf input(Windows 用户必加,让 Git 检出时自动转 LF) - VS Code 配置文件加
"files.eol": "\n",并设为默认 - Dockerfile 中避免直接
COPY *.sh,改用COPY build.sh /app/build.sh,减少批量导入风险 - CI/CD 流水线里加一步校验:
if grep -U $'\r' your_script.sh; then echo "CRLF detected"; exit 1; fi
最易被忽略的一点:Docker Desktop 的 WSL2 发行版本身也是个 Linux 环境,它对脚本的解析逻辑和原生 Ubuntu 完全一致——别把它当“Windows 工具”放松警惕,该按 Linux 规范来的一样不能少。











