Jak dodać użytkownika, gdy używam Alpine jako obrazu podstawowego?

107

Używam alpine(lub obrazu opartego na Alpine) jako obrazu podstawowego w moim pliku Dockerfile. Jakie instrukcje muszę dodać, aby utworzyć użytkownika?

Ostatecznie użyję tego użytkownika do uruchomienia aplikacji, którą umieszczę w kontenerze, aby użytkownik root tego nie zrobił.

Daniel Gartmann
źródło

Odpowiedzi:

221

Alpine używa polecenia adduseri addgroupdo tworzenia użytkowników i grup (zamiast useraddi 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

Flagi dla adduserto:

Użycie: adduser [OPTIONS] USER [GROUP]

Utwórz nowego użytkownika lub dodaj USER do GROUP

        -h DIR Katalog domowy
        -g GECOS Pole GECOS
        -s SHELL Powłoka logowania
        -G GRP Group
        -S Utwórz użytkownika systemu
        -D Nie przypisuj hasła
        -H Nie twórz katalogu domowego
        -u UID Identyfikator użytkownika
        -k Katalog szkieletów SKEL (/ etc / skel)

Dodaj oficjalne dokumenty nowego użytkownika

Daniel Gartmann
źródło
7
Lub alternatywnie możesz zastąpić cały powyższy fragment kodu, używając tego: USER 405który jest użytkownikiem gościa w Alpine Linux.
Daniel Gartmann
8
Dlaczego nie USER guest?
user672009
3
Poszedłbym z utworzeniem nowego użytkownika, ponieważ chcę, aby ten użytkownik miał taki sam UID / GID jak ten w systemie operacyjnym hosta, aby nie było problemu z uprawnieniami podczas uruchamiania dockera w systemie Linux. (nie dotyczy użytkowników macOS / Windows)
elquimista
5
Zauważ, że ponieważ Alpine jest oparty na BusyBox, jego polecenia adduseri addgroupróżnią się od adduseri addgroupsą dostarczane przez Debiana i Ubuntu, które z kolei są frontonami do useraddi groupadd. Warto zauważyć, że polecenia Debiana i Ubuntu obsługują tylko opcje długich formularzy. Zobacz: manpages.debian.org/stretch/adduser/adduser.8.en.html
Jack
Mam już utworzony kontener docker, teraz jakie polecenie muszę uruchomić, aby dodać użytkownika?
Aashish Kumar
65

Polecenia to adduseri addgroup.

Oto szablon dla Dockera, którego możesz używać w środowiskach busybox (alpine), a także w środowiskach opartych na Debianie (Ubuntu itp.):

ENV USER=docker
ENV UID=12345
ENV GID=23456

RUN adduser \
    --disabled-password \
    --gecos "" \
    --home "$(pwd)" \
    --ingroup "$USER" \
    --no-create-home \
    --uid "$UID" \
    "$USER"

Zwróć uwagę na następujące kwestie:

  • --disabled-password zapobiega pytaniu o hasło
  • --gecos "" omija monit o wpisanie „Full Name” itp. w systemach opartych na Debianie
  • --home "$(pwd)"ustawia dom użytkownika na WORKDIR. Możesz tego nie chcieć.
  • --no-create-home zapobiega kopiowaniu cruft do katalogu z /etc/skel

W opisie użycia tych aplikacji brakuje długich flag obecnych w kodzie dla adduser i addgroup .

Następujące flagi o długiej formie powinny działać zarówno w pochodnych alpejskich, jak i debianowych:

Dodaj użytkownika

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

Należy zauważyć, że jeśli --ingroupnie jest ustawiony, GID jest przypisywany tak, aby pasował do UID. Jeśli GID odpowiadający podanemu UID już istnieje, adduser nie powiedzie się.

Dodaj grupę

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

Wszystko to odkryłem, próbując napisać własną alternatywę dla projektu fixuid do uruchamiania kontenerów jako UID / GID hosta.

Mój skrypt pomocniczy punktu wejścia można znaleźć na GitHub.

Intencją jest dołączenie tego skryptu jako pierwszego argumentu, ENTRYPOINTktóry powinien spowodować, że Docker wywnioskuje UID i GID z odpowiedniego montowania powiązania.

Do określenia, skąd należy wywnioskować uprawnienia, może być wymagana zmienna środowiskowa „TEMPLATE”.

(W chwili pisania tego tekstu nie mam dokumentacji do mojego skryptu. Nadal jest na liście rzeczy do zrobienia !!)

rexypoo
źródło
11
+1, użycie długiej formy dla argumentów poleceń zwiększa czytelność i ułatwia konserwację. Podczas pisania skryptów powłoki zawsze używaj długiej postaci (Dockerfile RUN to nic innego jak skrypt powłoki).
Victor Schröder