必须先在Docker Desktop的File Sharing中添加宿主机路径,否则-v挂载会静默失败并报“Mounts denied”;添加后需Apply & Restart,再用原始绝对路径(如/Users/yourname/project)挂载,路径末尾不可带斜杠。

必须先在 Docker Desktop 的 File Sharing 设置里添加宿主机路径,否则 docker run -v 会静默失败,只报 “Mounts denied” —— 这是 90% 挂载不成功的根本原因。
Mac 上挂载前必须配置 File Sharing 列表
macOS 下 Docker Desktop 使用虚拟机隔离宿主机文件系统,未显式授权的路径一律拒绝挂载。即使路径真实存在、权限正确,docker run -v /Users/yourname/project:/app 也会直接退出并提示 “Mounts denied”。
- 打开 Docker Desktop → Preferences → Resources → File Sharing
- 检查你要挂载的路径(如
/Users/yourname/project)是否已在列表中;若没有,点击 + 添加它 - 点击 Apply & Restart —— 这一步不可跳过,重启后设置才生效
- 添加后无需改写路径:仍用原始绝对路径(如
/Users/yourname/project),不要拼/host_mnt/...
Windows 上要确认驱动器已共享且路径格式正确
Windows Pro/Enterprise 用户需在 Docker Desktop GUI 中手动勾选可共享的驱动器(如 C:、D:),否则绑定挂载会报 “drive has not been shared”。同时路径必须用正斜杠、带驱动器前缀,且不能含空格或中文(除非加引号包裹)。
- 右键任务栏 Docker 图标 → Settings → Resources → File Sharing
- 确保目标驱动器(如
C:)已被勾选;若没出现,点击 + 手动添加 - 命令中路径写成
C:/mydata,不是C:\mydata或C://mydata - 路径含空格时,整个宿主机路径必须用双引号:
"C:/My Data"
-v 和 --mount 的关键行为差异
两者都能挂载目录,但错误处理和默认行为不同,直接影响调试效率。
-
-v会静默创建宿主机上不存在的源目录(比如你写错路径/Users/xxx/misspelled,它会新建一个空文件夹) -
--mount严格校验宿主机路径存在性:若src=/xxx/yyy不存在,直接报No such file or directory,不创建 -
-v路径末尾带斜杠(如/path/)会被当文件处理,挂载失败;--mount同样不接受末尾斜杠 - 只读挂载推荐用
--mount type=bind,src=...,target=...,readonly,语义更清晰
验证挂载是否真生效的三步检查法
别只信 ls /app 看到文件就认为成功——可能只是镜像自带内容,或挂载点被覆盖。
- 进容器后执行
mount | grep app,输出里必须有明确 host path 条目(如on /app type overlay (rw,relatime)不算,那是镜像层) - 在宿主机该目录下新建一个测试文件(如
touch /Users/xxx/test-from-host),再进容器ls /app看是否立刻出现 - 在容器内
echo "from container" > /app/test-from-container,回宿主机检查该文件是否同步生成
最容易被忽略的是:File Sharing 设置修改后必须重启 Docker Desktop,而很多人点了 Apply 却没等它完成重启就急着跑命令——此时设置根本没加载。


















