我正在使用alpine
(或基于 Alpine 的图像)作为我的 Dockerfile 中的基本图像。我需要添加哪些说明才能创建用户?
最终,我将使用此用户来运行我将放入容器中的应用程序,以便 root 用户不会运行。
Alpine 使用命令adduser
和addgroup
来创建用户和组(而不是useradd
和usergroup
)。
FROM alpine:latest
# Create a group and user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
# Tell docker that all future commands should run as the appuser user
USER appuser
adduser
的标志是:
用法: 添加用户 [选项] 用户 [组] 创建新用户,或将用户添加到组 -h 目录 主目录 -g GECOS GECOS领域 -s 外壳 登录外壳 -G GRP集团 -S 创建系统用户 -D 不分配密码 -H 不创建主目录 -u UID 用户标识 -k SKEL 骨架目录 (/etc/skel)
添加新用户官方文档
命令是adduser
和addgroup
。
以下是您可以在busybox环境(alpine)以及基于Debian的环境(Ubuntu等)中使用的Docker模板:
ENV USER=docker
ENV UID=12345
ENV GID=23456
RUN adduser
--disabled-password
--gecos ""
--home "$(pwd)"
--ingroup "$USER"
--no-create-home
--uid "$UID"
"$USER"
请注意以下几点:
--disabled-password
阻止提示输入密码- 基于 Debian 的系统上"全名"等提示
--home "$(pwd)"
将用户的主目录设置为 WORKDIR。你可能不想要这个。--no-create-home
防止 cruft 从/etc/skel
复制到目录中
--gecos ""
规避了这些应用程序的用法说明缺少 adduser 和 addgroup 代码中存在的长标志。
以下长格式标志应该在 alpine 和 debian-衍生物中都有效:
添加用户
BusyBox v1.28.4 (2018-05-30 10:45:57 UTC) multi-call binary.
Usage: adduser [OPTIONS] USER [GROUP]
Create new user, or add USER to GROUP
--home DIR Home directory
--gecos GECOS GECOS field
--shell SHELL Login shell
--ingroup GRP Group (by name)
--system Create a system user
--disabled-password Don't assign a password
--no-create-home Don't create home directory
--uid UID User id
需要注意的一点是,如果未设置--ingroup
则分配 GID 以匹配 UID。如果与提供的 UID 对应的 GID 已存在,则添加用户将失败。
添加组
BusyBox v1.28.4 (2018-05-30 10:45:57 UTC) multi-call binary.
Usage: addgroup [-g GID] [-S] [USER] GROUP
Add a group or add a user to a group
--gid GID Group id
--system Create a system group
我在尝试编写自己的 fixuid 项目替代方案以将容器作为主机 UID/GID 运行时发现了所有这些。
我的入口点帮助程序脚本可以在 GitHub 上找到。
目的是将该脚本作为第一个参数预置ENTRYPOINT
这应该会导致 Docker 从相关的绑定挂载推断 UID 和 GID。
可能需要环境变量"TEMPLATE"来确定应从何处推断权限。
(在撰写本文时,我没有脚本的文档。它仍然在待办事项清单上!!
有包shadow
带来useradd
和usermod
。
adduser
有一些愚蠢的限制:
$ sudo adduser --disabled-password root
adduser: user 'root' in use
但usermod
不会:
$ sudo apk add shadow
$ sudo usermod --unlock root