标准答案
- 先确认进程实际 UID/GID、工作目录、目标路径每一级权限和镜像内文件 owner。
- 再检查 volume 或 bind mount 覆盖了哪些镜像目录、宿主机 owner、只读标志和 SELinux/AppArmor 标签。
- 最后确认 capability、seccomp、只读根文件系统和运行时安全配置是否阻止了系统调用或写入。
- 修复优先调整最小必要 owner、group、路径或能力,不要用 privileged 或全局 chmod 777 绕过。
题目解析
运行时挂载会把宿主机或 volume 的目录视图放到容器路径上,镜像中原有文件和权限可能被覆盖。一个 Permission denied 需要按实际 UID/GID、父目录、挂载只读标志、宿主机 owner、SELinux/AppArmor、capability 和 seccomp 分层排查。
修复应只改变必要边界:调整 volume owner/group、挂载模式、运行用户或单个 capability,并验证重新创建容器后仍然成立。chmod 777、root 和 privileged 会掩盖根因并扩大权限,不能作为默认答案。
常见误区
- 误区:只改镜像内 chmod。改正:检查挂载覆盖后的真实目录、宿主机 owner、uid/gid 和只读标志。
- 误区:直接改成 root 或 privileged。改正:定位缺失的最小权限或 capability,再做受控授权。
- 误区:忽略挂载覆盖。改正:用 inspect 和运行时 ls/stat 确认最终路径视图。