Docker Compose v2.29.3 及部分新版 CLI 不再自动创建宿主机绑定挂载目录,导致启动失败;应手动创建目录(如 mkdir -p ./html),或改用绝对路径、命名卷等方式规避。
宿主机目录不存在时,docker compose v2.29.3 及部分新版 docker cli 不再自动创建绑定挂载路径,导致启动失败。这不是“不支持创建”,而是创建逻辑被跳过——关键在于:docker 引擎本身从不自动创建 bind mount 的源目录,该职责本应由 compose 或用户承担,但当前版本存在逻辑缺陷。
确认是否真因目录缺失报错
看到类似错误时先验证:
- Error response from daemon: invalid mount config for type "bind": bind source path does not exist → 确实是宿主机路径不存在
- 用
ls -ld ./html(Linux/macOS)或dir D:\docker_data\config(Windows)检查路径是否存在 - 注意相对路径的基准:Compose 中的
./html是相对于docker-compose.yml所在目录,不是当前 shell 工作目录
手动创建宿主机目录(最直接可靠)
这是推荐的第一步,简单、明确、跨平台有效:
- Linux/macOS:
mkdir -p ./html && mkdir -p ./logs - Windows PowerShell:
mkdir -p "D:\docker_data\xinference\config" - 创建后建议
touch ./html/index.html或写入一个占位文件,避免后续被误判为空覆盖
规避自动创建失效的配置写法
v2.29.3 在同时使用顶层 volumes: 块和服务内 volumes: 时容易跳过目录创建。可改用以下任一方式:
- 只在服务内定义绑定挂载,移除顶层
volumes:块(除非你真需要命名卷) - 改用绝对路径(如
/home/user/app/html:/usr/share/nginx/html),减少路径解析歧义 - 避免在
volumes中混用绑定挂载和命名卷,例如不要这样写:volumes:<br> - ./html:/usr/share/nginx/html<br> - db_data:/var/lib/mysql
用命名卷替代绑定挂载(适合非开发场景)
如果不需要直接编辑宿主机文件,命名卷更省心:
- Docker 自动创建并管理存储位置,无需操心路径存在性
- 配置示例:
volumes:<br> - html_data:/usr/share/nginx/html
,并在顶层定义html_data: - 缺点:无法用文件管理器直接访问,调试不便;不适合静态资源热更新等开发流程
本质上,Bind Mount 的“源必须存在”是 Docker 引擎的硬性要求,自动创建只是 Compose 的便利功能——它失效时,回归手动创建是最稳的选择。不复杂但容易忽略。


















