当我使用 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带来useraddusermod

adduser 有一些愚蠢的限制:

$ sudo adduser --disabled-password root
adduser: user 'root' in use

usermod不是:

$ sudo apk add shadow
$ sudo usermod --unlock root

【讨论】:

【参考方案2】:

Alpine 使用命令adduseraddgroup 创建用户和组(而不是useraddusergroup)。

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 的标志是:

用法:adduser [OPTIONS] USER [GROUP] 创建新用户,或将 USER 添加到 GROUP -h DIR 主目录 -g GECOS GECOS 字段 -s SHELL 登录shell -G GRP 集团 -S 创建系统用户 -D 不指定密码 -H 不创建主目录 -u UID 用户ID -k SKEL 骨架目录 (/etc/skel)

Add new user official docs

【讨论】:

或者,您可以使用以下命令替换上面的整个 sn-p:USER 405,它是 Alpine Linux 中的来宾用户。 为什么不USER guest 我会创建一个新用户,因为我希望该用户与主机操作系统上的用户具有相同的 UID/GID,因此在 Linux 中运行 docker 时不会出现权限问题。 (不是 macOS/Windows 用户的问题) 请注意,由于 Alpine 基于 BusyBox,其 adduseraddgroup 命令不同于 Debian 和 Ubuntu 提供的 adduseraddgroup,后者又是 @ 的前端987654335@ 和groupadd。值得注意的是,Debian 和 Ubuntu 命令仅支持长格式选项。见:manpages.debian.org/stretch/adduser/adduser.8.en.html 我已经创建了一个 docker 容器,现在我需要运行什么命令来添加用户?【参考方案3】:

命令是adduseraddgroup

这是一个 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 作为基础镜像时,如何添加用户?的主要内容,如果未能解决你的问题,请参考以下文章

alpine 版的jdk环境镜像搭建与运行

Docker alpine 添加cst时区并发布镜像到docker.io

如何使用 jre-alpine 基础镜像创建 Scala Play 应用程序的 Docker 镜像

基于alpine基础镜像构建jdk镜像以及tomcat镜像及业务构建

alpine镜像时区设置

docker build 时 alpine 无法安装软件问题的解决