当我试图在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
指令来尽可能地减少创建的层数总是一个好主意,有关这方面的进一步阅读,请参阅这里。