Создание пользователя с uid 1000 на образе alpine Docker

Когда я пытаюсь создать пользователя с 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?

Какой идентификатор пользователя вы получите для плавания? У вас случайно не использовался UID на хосте докеров?

MJG 21.11.2022 08:45

Конкретный числовой идентификатор пользователя в Dockerfile не имеет значения, если он не равен нулю. (Как правило, образ должен запускаться на многих хостах с разными идентификаторами пользователей хоста.) Можете ли вы выбрать другое число или даже полностью удалить параметр -u?

David Maze 21.11.2022 12:27
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
1
2
331
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш синтаксис неверен, команда 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.

Другие вопросы по теме