问题现象
在 Windows 的 PowerShell / CMD 直接复制 Linux 示例命令,使用 -v $(pwd):/container/path 做目录挂载时,抛出如下错误:
plaintext
Error response from daemon: create $(pwd): "$(pwd)" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path
报错根因
$(pwd) 是 Linux /macOS Shell 语法,作用是获取当前目录绝对路径。
Windows 的 PowerShell、CMD 不识别该语法,Docker Daemon 会直接把 $(pwd) 当成自定义数据卷名称解析,而 $、(、) 属于卷名非法字符,最终报错。
✅ Linux / macOS:
$(pwd)可用❌ Windows PowerShell / CMD:不能直接复用 Linux 写法
各终端正确替换写法
1. PowerShell(推荐,Win10/11 默认终端)
使用 ${PWD.Path} 获取当前目录字符串,外层建议加双引号包裹路径,兼容带空格目录:
powershell
# 标准写法
docker run -v "${PWD.Path}:/app" nginx
2. CMD 命令提示符
内置变量 %cd% 代表当前目录:
cmd
docker run -v "%cd%:/app" nginx
3. WSL2(Ubuntu / Debian 等子系统)
原生 Linux Shell,可以直接沿用 $(pwd):
bash
docker run -v $(pwd):/app nginx
4. Git Bash(Windows)
Git Bash 存在自动路径转换问题,推荐在路径前增加斜杠规避解析异常:
bash
docker run -v /$(pwd):/app nginx
完整示例对比
❌ 错误(PowerShell 直接复制 Linux 命令)
powershell
docker run -v $(pwd):/app python
✅ 正确 PowerShell
powershell
docker run -v "${PWD.Path}:/app" python
✅ 直接写绝对路径(通用兼容所有终端)
powershell
docker run -v "C:\project\demo:/app" python
Windows 挂载避坑清单(高频附加问题)
- 路径尽量不要包含中文、空格、特殊符号,极易出现挂载失败、容器内目录为空
- Docker Desktop 使用 WSL2 后端时,优先在 WSL 内部执行挂载命令,权限兼容性更好
- 确认 Docker Desktop 开启文件共享权限:设置 → Resources → File Sharing,允许对应磁盘挂载
- 遇到权限拒绝:检查 WSL 用户 uid/gid,或在 run 命令增加
--user指定用户 - Docker Compose:yml 文件内可直接使用相对路径
./xxx:/app,跨平台兼容性优于命令行变量
补充:跨平台脚本建议
如果需要一份可以同时跑在 Linux、macOS、Windows PowerShell 的通用脚本,建议做环境判断,或者直接传入绝对路径,避免不同 shell 内置变量差异带来的兼容性问题。
参考官方文档:Docker Desktop 挂载路径兼容说明,不同终端下 pwd 变量解析行为不一致Docker
如果你需要,我还可以补充:
- 可直接复用的跨平台 powershell /bash 脚本模板
- Docker Compose 如何处理 Windows 和 Linux 目录挂载兼容问题
正文完
可以使用微信扫码关注公众号(ID:xzluomor)