首页/云/云与容器速查/挂载失败排查(Permission denied / No such file)

挂载失败排查(Permission denied / No such file)

挂载问题分三类:路径不存在或类型不符、权限不足(uid/SELinux)、底层存储异常(NFS/云盘)。docker inspect 的 Mounts 段先确认最终挂载参数。

云与容器速查云更新于 2026-10-13

挂载失败分哪几类

挂载失败通常分三类:路径不存在或类型不符(挂文件时宿主上是目录,反之亦然)、权限不足(容器用户与宿主目录属主不匹配,或安全模块的标签不允许)、底层存储异常(NFS 或云盘断连、被只读重挂)。定位第一步是用 inspect 看清最终生效的挂载参数,而不是靠猜。

基本信息

源路径不存在宿主路径不存在,或挂单文件时宿主上先有同名目录
权限拒绝容器内用户对宿主目录没有写权限
安全标签需要给挂载路径加正确的标签后缀,否则仍被拒绝
IO 错误NFS 或云盘断连、被以只读方式重挂
核对参数看 inspect 的挂载段确认来源、目标与读写模式
验证进容器看目录属主,并尝试写一个探针文件

报错与根因

报错根因处置
找不到源路径宿主路径不存在或拼写错误先创建路径再挂载
权限拒绝属主或权限与运行用户不匹配调整宿主目录属主或运行用户
标签类拒绝安全模块上下文不允许挂载时加上正确的标签后缀
输入输出错误NFS 或云盘异常查内核日志与存储侧状态
容器内文件消失挂载覆盖了镜像内目录改为挂单文件或先复制数据

排查命令

排查命令
docker inspect myapp -f '{{json .Mounts}}' | python3 -m json.tool  # 看最终挂载参数
docker exec myapp sh -c 'id; ls -ld /data'                         # 身份与目录属主
docker exec myapp sh -c 'touch /data/.probe && echo ok && rm /data/.probe'
dmesg | tail -20                                                   # 存储断连类错误常在这里

典型使用场景

  • 容器启动即报找不到挂载源路径,需要确认宿主路径是否真的存在
  • 应用启动后写日志失败,实际是目录属主与运行用户不匹配
  • 存储抖动导致容器内读写报 IO 错误
  • 升级后发现镜像内原有文件消失,实为挂载点覆盖
NFS 挂载在宿主能访问不代表容器可用:容器 uid 映射与 squash 选项会让权限表现完全不同,必须在容器里实测一次。
挂单个文件时宿主路径必须是文件:如果宿主上存在同名目录,挂载会失败或出现意料外的行为。
挂载点会覆盖镜像内的目录内容,造成原文件消失的假象;排查时先确认挂载关系,再怀疑镜像本身。

易错点

  • 宿主用 root 建目录、容器用非 root 跑:写入被拒,日志含糊
  • 挂载覆盖了镜像里的目录内容:原文件消失,被误判为镜像坏了
  • 挂单文件时宿主路径是目录:挂载直接失败或行为异常
  • 忽略安全模块标签:权限看着正常却仍然被拒
  • 在宿主验证通过就下结论:容器内权限与宿主并不一致

数据来源与参考

  • Docker Docs:Bind mounts(Troubleshooting)
  • Docker Docs:Volumes

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌