在alpine Docker镜像上创建uid为1000的用户



当我试图在Dockerfile中创建UID=1000用户

FROM alpine:3.16
RUN addgroup -g 1000 sail
RUN adduser -g 1000 -u 1000 sail

我得到错误:

Step 3/3 : RUN adduser -g 1000 -u 1000 sail
---> Running in 0c4ce7e0bddf
adduser: uid '1000' in use
The command '/bin/sh -c adduser -g 1000 -u 1000 sail' returned a non-zero code: 1

但是,如果我构建一个没有这个阶段的容器,并查看/etc/passwd,则没有UID=1000的用户。所以它只存在于建筑中

如何在alpine中正确创建UID=1000用户?

您的语法不正确,Alpine的adduser命令是BusyBox命令,因此,与"常规">adduser不同,这里是它的帮助页面:

BusyBox v1.35.0 (2022-08-01 15:14:44 UTC) multi-call binary.
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)

你可以很容易地浏览它,运行命令:

docker run -ti --rm alpine:3.16 adduser

这里的重要信息部分是:

-g GECOS        GECOS field
-G GRP          Group

你可以看到,一个组,在BusyBoxadduser需要你添加选项G,大写字母,和选项g小写字母,如果为其他。

该选项允许您添加组,而不是GID,因此您需要以下命令:

RUN adduser -G sail -u 1000 sail

此外,如果运行该命令,shell将提示您填写密码。您需要使用D选项跳过这个:

-D              Don't assign a password
因此,你的Dockerfile最终是:
FROM alpine:3.16
RUN addgroup -g 1000 sail 
&& adduser -G sail -u 1000 sail -D

请注意,在Docker中,通过运行后续的RUN指令来尽可能地减少创建的层数总是一个好主意,有关这方面的进一步阅读,请参阅这里。

最新更新