For the complete documentation index, see llms.txt. This page is also available as Markdown.

7.11 USER 指定当前用户

7.11.1 基本语法

USER <用户名>[:<用户组>]
USER <UID>[:<GID>]

USER 指令切换后续指令 (RUN、CMD、ENTRYPOINT) 的执行用户。


7.11.2 为什么要使用 USER

笔者强调:以非 root 用户运行容器是最重要的安全实践之一。


7.11.3 基本用法

创建并切换用户

使用 UID/GID


7.11.4 用户必须已存在

USER 指令只能切换到 已存在 的用户:

创建用户的方式

Debian/Ubuntu:

Alpine:

选项
说明

-r (useradd) / -S (adduser)

创建系统用户

-g

指定主组

-G

指定附加组

-u

指定 UID

-s /bin/false

禁用登录 shell


7.11.5 运行时切换用户

使用 gosu:推荐

在 ENTRYPOINT 脚本中切换用户时,不要使用 su 或 sudo,应使用 gosu:

docker-entrypoint.sh:

为什么不用 su/sudo

问题
su/sudo
gosu

TTY 要求

需要

不需要

信号传递

不正确

正确

子进程

是

exec 替换

容器中使用

❌

✅


7.11.6 运行时覆盖用户

使用 -u 或 --user 参数:


7.11.7 文件权限处理

切换用户后,确保应用有权访问文件:


7.11.8 最佳实践

1. 始终使用非 root 用户

2. 使用固定 UID/GID

便于在宿主机和容器间共享文件:

3. 多阶段构建中的 USER


7.11.9 常见问题

Q:权限被拒绝

解决:确保目录权限正确

Q:无法绑定低于 1024 的端口

非 root 用户无法绑定 80、443 等端口。

解决:

  1. 使用高端口(如 8080)

  2. 在运行时映射端口:docker run -p 80:8080


最后更新于