标准答案
- 镜像中应用代码、缓存、日志和临时目录要有明确的 owner、group 和写权限,尽量把代码目录设为只读。
- 低端口绑定可能需要 capability、端口映射或更高端口,不能通过恢复 root 权限粗暴解决。
- 运行时挂载的 volume、secret 和配置文件权限可能覆盖镜像内权限,需要在真实运行环境验证。
- 切换用户后要测试启动、迁移、日志、证书刷新、子进程和优雅停机。
题目解析
非 root 身份可能同时受 Dockerfile 的 USER、运行时的 uid/gid、平台 securityContext、volume owner 和 Secret mode 影响。镜像内目录权限正确,挂载后仍可能变成不可写;反过来为了写一个目录把整个容器改成 root,会扩大所有漏洞的影响面。
应把代码、缓存、日志、临时目录和数据目录分开,使用固定非 root uid 或启动前完成受控的目录初始化。低端口通过端口映射或最小 capability 处理,最终要在真实 volume、证书、日志和升级流程中验证。
常见误区
- 误区:为了写目录把整个容器改成 root。改正:修复目录 owner/group、使用 init/chown 或单独可写挂载。
- 误区:只在镜像内测试。改正:用真实运行 uid、volume、Secret、日志和端口映射做集成验证。