检查容器文件系统挂载与权限需区分宿主机和容器视角:镜像未运行无法查挂载,必须针对运行中容器用docker inspect提取mounts信息,再通过docker exec验证uid/gid匹配及读写能力,并在宿主机端用ls -ln和ls -z核对属主与selinux上下文。

检查容器文件系统的挂载点与权限,关键在于分清“宿主机视角”和“容器内视角”,并结合运行状态判断——镜像未启动时无法查挂载,容器停止后部分信息不可用,必须针对运行中或刚退出的容器操作。
查看容器实际挂载点与路径映射
运行中的容器才能反映真实挂载结构。用 docker inspect 提取结构化信息最可靠:
- 查所有挂载项:
docker inspect -f '{{json .Mounts}}' 容器名或ID(返回 JSON 数组,含源、目标、类型、读写等) - 只看宿主机源路径:
docker inspect -f '{{range .Mounts}}{{.Source}} {{end}}' 容器名 - 只看容器内目标路径:
docker inspect -f '{{range .Mounts}}{{.Destination}} {{end}}' 容器名 - 确认是否可写:
docker inspect -f '{{range .Mounts}}{{.RW}} {{end}}' 容器名(输出true或false)
验证挂载后文件权限是否生效
挂载配置正确 ≠ 权限可用,必须验证容器内用户能否真正访问:
- 进容器查当前用户:
docker exec 容器名 id,关注uid=xxx gid=yyy - 查挂载目录属主与权限:
docker exec 容器名 stat /挂载路径(比ls -l更准,直接显示 UID/GID 数值) - 测试读写能力:
docker exec 容器名 sh -c "cat /挂载路径/test.txt >/dev/null && echo ok || echo fail" - 若需模拟非 root 用户视角,启动时加
-u 1001或执行时加docker exec -u 1001 容器名 ...
排查宿主机端权限匹配问题
绑定挂载(-v)下,容器内权限异常往往源于宿主机目录的 UID/GID 或安全策略不兼容:
- 在宿主机上查目录真实属主:
ls -ln /宿主机路径(重点看数字 UID/GID,不是用户名) - 对比容器内用户 UID 是否一致;不一致时,要么改宿主机目录属主(
sudo chown -R 1001:1001 /宿主机路径),要么用-u 1001启动容器 - SELinux 环境(如 CentOS/RHEL)需检查上下文:
ls -Z /宿主机路径,若类型不匹配(如显示user_home_dir_t但容器需要svirt_sandbox_file_t),用chcon -Rt svirt_sandbox_file_t /宿主机路径
快速验证镜像默认行为(未运行前)
虽不能查挂载,但可预判容器内用户和基础权限设置:
- 查镜像默认用户:
docker inspect 镜像名 | jq '.[0].Config.User'(需装 jq)或看 Dockerfile 中USER指令 - 临时运行并列目录权限:
docker run --rm -it 镜像名 ls -l /app - 模拟指定用户运行:
docker run -u 1001 --rm -it 镜像名 ls -ld /app,观察是否因 UID 不匹配导致权限拒绝











