挂载失败分哪几类
挂载失败通常分三类:路径不存在或类型不符(挂文件时宿主上是目录,反之亦然)、权限不足(容器用户与宿主目录属主不匹配,或安全模块的标签不允许)、底层存储异常(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 选项会让权限表现完全不同,必须在容器里实测一次。
挂单个文件时宿主路径必须是文件:如果宿主上存在同名目录,挂载会失败或出现意料外的行为。
挂载点会覆盖镜像内的目录内容,造成原文件消失的假象;排查时先确认挂载关系,再怀疑镜像本身。