Bind Mount 排错核心是路径存在性、权限一致性、挂载时机:宿主机路径须真实存在(Docker 不自动创建父目录),相对路径以 docker-compose.yml 为准,权限需匹配容器用户,挂载会覆盖容器内原路径内容。
Bind Mount 排错核心就三点:路径存在性、权限一致性、挂载时机是否正确。不是加了 -v 就一定生效,很多问题出在细节上。
宿主机路径必须真实存在,Docker 不会自动创建父目录(比如 /data/conf 但 /data 本身不存在)。
ls -ld /your/host/path,确认目录存在且可读./config)是相对于 docker-compose.yml 所在目录,不是当前 shell 路径/Config 和 /config 是两个目录容器内进程以非 root 用户运行时(推荐做法),宿主机目录权限若未开放,就会报 Permission denied 或 ENOENT(看似文件不存在,实为无权访问)。
docker inspect myapp | jq '.Config.User'
ls -ld /host/path
sudo chown -R 1001:1001 /host/path(假设容器用 UID 1001)user: + group_add: 配合宿主机组 ID,而非粗暴 chmod 777
Bind Mount 会把宿主机目录“原样盖上去”,如果容器镜像里该路径已有文件(比如 /app/config.yaml),挂载后这些文件就不可见了——这是设计行为,不是 bug。
docker run --rm -v $(pwd)/config:/tmp/out alpine cp /app/config.yaml /tmp/out/
/etc、/usr/bin),极易引发启动失败桌面版 Docker Desktop 默认只共享特定目录(如 /Users、C:Users),挂载其他路径会静默失败或提示 permission denied。
C:)