当我使用 Alpine 作为基础镜像时,如何添加用户?
Posted
技术标签:
【中文标题】当我使用 Alpine 作为基础镜像时,如何添加用户?【英文标题】:How do I add a user when I'm using Alpine as a base image? 【发布时间】:2018-10-01 23:10:03 【问题描述】:我在我的 Dockerfile 中使用alpine
(或基于 Alpine 的图像)作为基础图像。我需要添加哪些指令来创建用户?
最终我将使用这个用户来运行我将放置到容器中的应用程序,这样 root 用户就不用了。
【问题讨论】:
【参考方案1】:有包shadow
带来useradd
和usermod
。
adduser
有一些愚蠢的限制:
$ sudo adduser --disabled-password root
adduser: user 'root' in use
但usermod
不是:
$ sudo apk add shadow
$ sudo usermod --unlock root
【讨论】:
【参考方案2】: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
的标志是:
Add new user official docs
【讨论】:
或者,您可以使用以下命令替换上面的整个 sn-p:USER 405
,它是 Alpine Linux 中的来宾用户。
为什么不USER guest
?
我会创建一个新用户,因为我希望该用户与主机操作系统上的用户具有相同的 UID/GID,因此在 Linux 中运行 docker 时不会出现权限问题。 (不是 macOS/Windows 用户的问题)
请注意,由于 Alpine 基于 BusyBox,其 adduser
和 addgroup
命令不同于 Debian 和 Ubuntu 提供的 adduser
和 addgroup
,后者又是 @ 的前端987654335@ 和groupadd
。值得注意的是,Debian 和 Ubuntu 命令仅支持长格式选项。见:manpages.debian.org/stretch/adduser/adduser.8.en.html
我已经创建了一个 docker 容器,现在我需要运行什么命令来添加用户?【参考方案3】:
命令是adduser
和addgroup
。
这是一个 Docker 模板,您可以在 busybox 环境(alpine)以及基于 Debian 的环境(Ubuntu 等)中使用:
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
阻止提示输入密码
--gecos ""
在基于 Debian 的系统上绕过“全名”等提示
--home "$(pwd)"
将用户的家设置为 WORKDIR。 你可能不想要这个。
--no-create-home
防止 cruft 从 /etc/skel
复制到目录中
这些应用程序的使用说明缺少adduser 和addgroup 代码中的长标志。
以下长格式标志应该在 alpine 和 debian-derivatives 中都可以使用:
添加用户
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 已经存在,则 adduser 会失败。
添加组
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 运行时发现了这一切。
My entrypoint helper script 可以在 GitHub 上找到。
目的是将该脚本作为ENTRYPOINT
的第一个参数添加到前面,这将使 Docker 从相关的绑定挂载中推断出 UID 和 GID。
可能需要环境变量“TEMPLATE”来确定应从何处推断权限。
(在撰写本文时,我的脚本没有文档。它仍在待办事项列表中!!)
【讨论】:
+1,对命令参数使用长格式增加了可读性并简化了维护。编写 shell 脚本时,请始终使用长格式(Dockerfile RUN is 只不过是一个 shell 脚本)。 很好的答案,感谢您分享您的脚本。我有兴趣保留主机 uid/gid:在基于 debian 的图像上,我的方法包括通过 env 变量传递这些或从绑定的工作区文件夹中推断。通过使用带有--non-unique
标志的命令useradd/groupadd
,所有这些都变得更容易了。无论如何要在 alpine 中创建重复的 id 用户/组?
我找到了我的问题的答案:安装shadow
。以上是关于当我使用 Alpine 作为基础镜像时,如何添加用户?的主要内容,如果未能解决你的问题,请参考以下文章
Docker alpine 添加cst时区并发布镜像到docker.io
如何使用 jre-alpine 基础镜像创建 Scala Play 应用程序的 Docker 镜像