当前位置: 首页 > 知识库问答 >
问题:

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

郤坚诚
2023-03-14

我在Dockerfile中使用<code>alpine</code>(或基于alpine的图像)作为基础图像。创建用户需要添加哪些指令?

最终,我将使用此用户来运行我将放入容器中的应用程序,以便 root 用户不会这样做。

共有3个答案

冀弘济
2023-03-14

有带来用户添加的阴影

adduser有一些愚蠢的限制:

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

但是< code>usermod不是:

$ sudo apk add shadow
$ sudo usermod --unlock root
诸超
2023-03-14

命令是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"

请注意以下几点:

  • --disable-password阻止提示输入密码
  • --gecos""在基于Debian的系统上规避了“全名”等提示
  • --home"$(pwd)"将用户的home设置为WORKDIR。您可能不想要这个。
  • --no-create-home防止cruft从/etc/skel
  • 复制到目录中

这些应用程序的用法说明缺少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

需要注意的一点是,如果没有设置< code> - 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上找到。

其目的是将该脚本作为第一个参数附加到入口点,这应该会导致 Docker 从相关的绑定装载中推断 UID 和 GID。

可能需要一个环境变量“TEMPLATE”来确定应该从哪里推断权限。

(在写作时,我没有为我的脚本留档。它仍然在待办事项列表上!!)

奚光霁
2023-03-14

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

<code>adduser</code>的标志为:

Usage: adduser [OPTIONS] USER [GROUP]

Create new user, or add USER to GROUP

        -h DIR          Home directory
        -g GECOS        GECOS field
        -s SHELL        Login shell
        -G GRP          Group
        -S              Create a system user
        -D              Don't assign a password
        -H              Don't create home directory
        -u UID          User id
        -k SKEL         Skeleton directory (/etc/skel)

添加新用户官方文档

 类似资料:
  • 问题内容: 我正在处理dockerfile。我只是意识到我一直在使用索引图像。 所以我想知道: 如何在我的本地(自定义)图像之一不作为索引的情况下将其用作基础()图像? 问题答案: 您可以使用它而无需执行任何特殊操作。如果您有一个本地图像,可以这样做。如果您在Dockerfile中进行操作,但 没有 名为的本地映像, 则 Docker将尝试从注册表中提取它。 换句话说,如果Dockerfile这样

  • 正如你在下面的代码片段中看到的,我很难让蓝色覆盖贴在图像上,但是正如你所看到的,在左侧,由于某种原因,它没有贴在图片上。是的,我希望一整列的位置比另一列低/高一点,所以这里我尝试将整列1定位70px,但它撕裂了蓝色覆盖层和图像。有什么想法吗? null null

  • 我试图创建一个小行星游戏,但我已经在一开始就很挣扎了:我想在游戏开始前创建一个倒计时。为了做到这一点,我使用了一个计时器,当按下按钮“开始”时开始,它(应该)每秒钟加载一个,然后显示在一个上。 在我加上计时器之前,整个程序运行得很好。然而,图像仍在绘制中,的方法仍在完全使用。但是,图像不会出现在我的上。 有人能发现错误吗?我真的不明白问题是什么,虽然我对计时器不熟悉,所以如果我做的事情真的很愚蠢,

  • 我从openjdk:8-jdk-alpine创建了一个docker映像,但当我尝试执行简单命令时,会出现以下错误:

  • 问题内容: 我从openjdk:8-jdk-alpine创建了一个docker镜像,但是当我尝试执行简单的命令时出现以下错误: 问题答案: 默认情况下,高山docker映像未安装bash。您将需要添加以下命令来获取: 如果您使用,那么您可以 保持docker映像大小较小。(感谢@sprkysnrky的评论)

  • 问题内容: 我有一个网站,用户可以在其中上传图片… 上传图像后,我需要在图像上添加徽标(水印)。 我该怎么办? 而且重要的一点是,水印必须位于可以看到的角落,例如,我看到的网站会即时生成水印,并将水印放置在主图像的背景为“相同颜色”的任何位置,因此如果您明白我的意思,水印就会伸出来。 有人对此有很好的教程或文章吗?还是知道在php中需要找到水印位置的任何函数? 问题答案: :