首页/云/云与容器速查/Dockerfile USER 运行用户
容器与 Docker106 条

Dockerfile USER 运行用户

指定后续指令与容器进程的默认用户。安全基线要求不用 root 跑应用:先建用户、调整目录属主,再切 USER;系统级安装必须放在切换之前。

云与容器速查云更新于 2026-10-13

USER 指令是什么

USER 指定其后指令以及容器运行进程的默认身份。安全基线要求应用不以 root 运行,一旦进程被突破,影响面会小很多。正确顺序是先完成系统级安装,再创建用户、调整文件属主,最后切到非 root 身份。

基本信息

作用影响其后的 RUN 指令与容器启动进程的身份
前置先用 groupadd 与 useradd 建用户,或直接写数字 UID
文件归属USER 之后 RUN 生成的文件归该用户所有
复制归属COPY 用 --chown 一步设定,比事后 chown 更省层
运行时覆盖docker run -u 可临时改用其他身份
基础镜像部分官方镜像已内置非 root 用户,可直接引用

常见权限问题

现象原因处置
启动即退出且日志很少目录属主仍是 root用 COPY --chown 或 chown 修正
写日志报权限拒绝日志目录由 root 创建把目录属主改成运行用户
装包失败USER 之后执行了系统级命令把安装步骤移到 USER 之前
挂载宿主目录后无权限宿主目录权限与容器用户不匹配调整宿主目录属主或权限

非 root 运行示例

非 root 运行示例
FROM node:20-alpine
WORKDIR /app
RUN addgroup -S app && adduser -S app -G app   # 先建系统用户与组
COPY --chown=app:app package*.json ./          # 复制时就设好属主
RUN npm ci --omit=dev
COPY --chown=app:app . .
USER app                                       # 之后以非 root 运行
CMD ["node","server.js"]

典型使用场景

  • 满足安全基线,用非 root 身份运行应用进程
  • 多阶段构建的运行阶段切换身份,且不带构建工具
  • 与只读根文件系统配合,把可写路径收到最小
  • 交付前按等保或合规要求收紧运行身份
USER 之后的 RUN 不再拥有 root 权限:装系统包、写系统目录都会失败,系统级操作必须全部放在切换之前。
使用数字 UID 可以不依赖镜像内是否创建了同名用户,在只读根文件系统或受限权限策略下更省事。
切了 USER 却没调整文件属主,应用可能直接启动失败,而日志里往往只看到笼统的权限错误,排查成本很高。

易错点

  • 切了 USER 没改文件属主:应用无权限写目录,启动即崩
  • 以为 --chown 能覆盖全部:它只作用于 COPY,RUN 生成的文件仍需处理
  • 把系统级安装放在 USER 之后:装包失败,构建中断
  • 挂载宿主目录后忘了权限对齐:容器内非 root 用户无法写入
  • 直接用数字 UID 却不记录含义:后续维护看不懂这个用户是谁

数据来源与参考

  • Docker Docs:Dockerfile reference(USER)
  • CIS Docker Benchmark(非 root 运行)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌