当我使用Alpine作为基本图像时如何添加用户?


98

alpine在Dockerfile中使用(或基于Alpine的映像)作为基础映像。创建用户需要添加哪些说明?

最终,我将使用该用户来运行将放置到容器中的应用程序,以便root用户不会。

Answers:


206

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登录外壳
        -G GRP集团
        -S创建系统用户
        -D不要分配密码
        -H不要创建主目录
        -u UID用户ID
        -k SKEL骨架目录(/ etc / skel)

添加新的用户官方文档


7
或者,您可以使用以下命令替换上面的整个代码段:USER 405Alpine Linux中的来宾用户。
Daniel Gartmann

8
为什么不USER guest呢?
user672009

3
我会创建一个新用户,因为我希望该用户具有与主机OS上相同的UID / GID,因此在Linux中运行docker时没有权限问题。(不是macOS / Windows用户的问题)
elquimista

5
请注意,由于Alpine基于BusyBox,因此其adduseraddgroup命令不同于Debian和Ubuntu提供的和命令,adduseraddgroupDebian和Ubuntu则是useraddand的前端groupadd。值得注意的是,Debian和Ubuntu命令仅支持长格式选项。参见:manpages.debian.org/stretch/adduser/adduser.8.en.html
杰克

我已经创建了一个docker容器,现在需要运行什么命令来添加用户?
Aashish Kumar

63

命令是adduseraddgroup

这是Docker的模板,可以在busybox环境(高山)以及基于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

这些应用程序的用法说明缺少adduseraddgroup代码中存在的长标志

以下长格式标志在高山以及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已经存在,则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运行时,我发现了所有这些内容。

我的入口点帮助程序脚本可以在GitHub上找到。

目的是将该脚本作为第一个参数,ENTRYPOINT该参数应使Docker从相关的绑定安装中推断出UID和GID。

可能需要环境变量“ TEMPLATE”来确定应从何处推断出权限。

(在撰写本文时,我没有脚本的文档。它仍在待办事项清单上!)


9
+1,将长格式用作命令args可提高可读性并简化维护。编写shell脚本时,请始终使用长格式(Dockerfile RUN 就是 shell脚本)。
VictorSchröder19年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.