Як додати користувача, коли я використовую Alpine як базове зображення?


106

Я використовую alpine(або зображення, яке базується на Alpine) як базове зображення у моєму Dockerfile. Які вказівки мені потрібно додати, щоб створити користувача?

Зрештою я використаю цього користувача для запуску програми, яку розміщу в контейнері, щоб корінний користувач цього не робив.

Відповіді:


219

Alpine використовує команду adduserі addgroupдля створення користувачів та груп (а не useraddта usergroup).

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

Прапорами для adduserє:

Використання: adduser [ОПЦІЇ] КОРИСТУВАЧ [ГРУПА]

Створіть нового користувача або додайте КОРИСТУВАЧА до ГРУПИ

        -h DIR Домашній каталог
        -g поле GECOS GECOS
        -s SHELL Вхідна оболонка
        -G GRP Group
        -S Створення системного користувача
        -D Не призначати пароль
        -H Не створюйте домашній каталог
        -u UID ідентифікатора користувача
        -k Каталог скелетів SKEL (/ etc / skel)

Додайте нових офіційних документів користувача


7
Або ж ви можете замінити цілий фрагмент, наведений вище, використовуючи це: USER 405який є запрошеним користувачем в Alpine Linux.
Даніель Гартманн,

8
Чому ні USER guest?
user672009

3
Я хотів би створити нового користувача, тому що я хочу, щоб цей користувач мав такий самий UID / GID, що і той, що знаходиться в головній ОС, щоб не було проблеми з дозволом під час запуску докера в Linux. (не проблема з користувачами macOS / Windows)
elquimista

5
Слід зазначити , що , оскільки Альпійський заснований на BusyBox, його adduserі addgroupкоманди відрізняються від adduserі , addgroupяк це передбачено Debian і Ubuntu , які в свою чергу, передні кінці до useraddі groupadd. Примітно, що команди Debian та Ubuntu підтримують лише довгі варіанти форми. Див.: Manpages.debian.org/stretch/adduser/adduser.8.en.html
Джек

Я вже створив контейнер докера, тепер яку команду мені потрібно виконати, щоб додати користувача?
Аашіш Кумар,

65

Командами є adduserі addgroup.

Ось шаблон для Docker, який ви можете використовувати в середовищах зайнятості (альпійські), а також в середовищах на базі 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"

Зверніть увагу на таке:

  • --disabled-password запобігає запит на введення пароля - -
  • --gecos "" обходить запит "Повне ім'я" тощо в системах на базі Debian
  • --home "$(pwd)"встановлює для користувача дім WORKDIR. Ви можете цього не хотіти.
  • --no-create-home запобігає копіюванню копій в каталог з /etc/skel

В описі використання цих програм відсутні довгі прапорці, присутні в коді adduser та addgroup .

Наступні прапори довгої форми повинні працювати як в альпійській, так і в похідних від debian:

adduser

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

Зауважимо одне: якщо --ingroupне встановлено, тоді GID призначається відповідно до UID. Якщо GID, що відповідає наданому UID, вже існує, adduser не вдасться.

addgroup

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.

Намір полягає у додаванні цього сценарію як першого аргументу, до ENTRYPOINTякого Docker повинен зробити висновок UID та GID із відповідного монтування прив'язки.

Змінна середовища "ШАБЛОН" може знадобитися, щоб визначити, звідки слід виводити дозволи.

(На момент написання статті я не маю документації для свого сценарію. Він все ще в списку завдань !!)


11
+1, використання довгої форми для аргументів команд підвищує читабельність та полегшує обслуговування. При написанні сценаріїв оболонки завжди використовуйте довгу форму (Dockerfile RUN - це не що інше, як сценарій оболонки).
Віктор Шредер,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.