指定用户与工作目录
两个运行参数分别控制进程以什么身份启动、从哪个目录开始工作。它们解决的实际问题很具体:容器默认以高权限用户运行,写出来的文件属主是超级用户,宿主上别人改不动;工作目录不对则相对路径全部失效,配置与产物写到意外的位置。
基本信息
| 用户参数 | 可写用户名,也可写用户编号与组编号的组合 |
|---|---|
| 目录参数 | 指定容器内路径作为初始工作目录 |
| 默认值 | 用户为镜像内声明的身份(多数镜像为超级用户),目录为镜像里设定的工作目录 |
| 编号写法 | 容器内没有同名账号时可以直接用编号,不需要预先创建用户 |
| 适用平台 | 所有容器引擎环境,权限行为与宿主一致 |
典型使用场景
- 挂载目录写文件:让容器以宿主对应编号运行,产出文件属主便于编辑与备份
- 降低运行权限:服务不需要特权时不使用超级用户,缩小被入侵后的影响
- 核对应用视角:以应用身份执行命令,验证权限问题是否真实存在
- 指定工作目录:让脚本里的相对路径落在预期位置,避免误写
- 共享目录协作:多个服务写同一目录时统一编号,减少权限冲突
常用示例
常用示例
docker run --rm -u 1000:1000 -v $PWD:/work -w /work alpine:3.20 touch out.txt # 产出文件属主为普通用户
docker run --rm -u www-data php:8.3-fpm id # 以指定账号运行
docker run -d -u 1001:1001 -w /app app/api:v1.2 # 常驻服务降权运行
docker exec -u 1000 web id # 进容器核对应用身份
ls -ln out.txt # 看数字属主确认一致常见权限现象与原因
| 现象 | 原因 | 处理 |
|---|---|---|
| 产出文件属主是超级用户 | 容器以默认高权限用户运行 | 运行时指定编号,或在构建期调整目录属主 |
| 写入挂载目录被拒 | 容器内编号与宿主目录属主不一致 | 对齐编号或放开目录权限 |
| 读不到配置文件 | 文件权限过严或属主不匹配 | 调整文件权限并确认可读 |
| 工作目录不存在 | 目标路径在镜像里没有创建 | 指定前先确认路径,或在构建期创建 |
| 脚本输出到了意外位置 | 工作目录与预期不一致 | 显式指定工作目录,避免依赖默认值 |
权限设计建议
- 宿主目录属主与容器运行编号统一,跨机器部署时保持同一编号
- 构建期就把应用目录属主设好,运行期无需再提权修改
- 能用非特权用户就不要用超级用户,尤其对外提供服务的进程
- 需要绑定低编号端口的场景,用端口映射把外部端口转进来,避免为了端口而提权
- 权限变更后回归验证读写路径,别只验证服务能启动
宿主目录权限按编号匹配,不是按用户名。两台机器上同名账号的编号不同,权限结果就不一样,跨机器协作要对齐编号。
以非特权身份运行后,之前靠高权限才能写入的目录会立刻暴露权限问题。上线前先在测试环境验证读写路径,别等生产上写日志失败才发现。