Когда я пытаюсь создать пользователя с UID=1000
в Dockerfile
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
не будет. Так что он существует только во время строительства.
Как правильно создать пользователя с UID=1000
в alpine?
Конкретный числовой идентификатор пользователя в Dockerfile не имеет значения, если он не равен нулю. (Как правило, образ должен запускаться на многих хостах с разными идентификаторами пользователей хоста.) Можете ли вы выбрать другое число или даже полностью удалить параметр -u
?
Ваш синтаксис неверен, команда adduser
Alpine — это команда 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
Где вы можете видеть, что группа в BusyBox adduser
требует, чтобы вы были добавлены с опцией G
заглавной буквой, а опция g
строчными буквами, если для чего-то еще.
Опция позволяет добавить группу, а не GID, поэтому вам понадобится команда:
RUN adduser -G sail -u 1000 sail
Кроме того, если вы запустите эту команду, оболочка предложит вам ввести пароль. Вам нужно будет пропустить это с опцией D
:
-D Don't assign a password
Итак, ваш Dockerfile в конечном итоге выглядит так:
FROM alpine:3.16
RUN addgroup -g 1000 sail \
&& adduser -G sail -u 1000 sail -D
Note that it is always a good idea, in Docker, to reduce as much as possible the number of layers you are creating by running subsequent RUN
instruction, for further reading on this, see here.
Какой идентификатор пользователя вы получите для плавания? У вас случайно не использовался UID на хосте докеров?