Wie füge ich einen Benutzer hinzu, wenn ich Alpine als Basis-Image verwende?

95

Ich verwende alpine(oder ein Bild, das auf Alpine basiert) als Basisbild in meiner Docker-Datei. Welche Anweisungen muss ich hinzufügen, um einen Benutzer zu erstellen?

Schließlich werde ich diesen Benutzer verwenden, um die Anwendung auszuführen, die ich in den Container einfügen werde, damit der Root-Benutzer dies nicht tut.

Daniel Gartmann
quelle

Antworten:

201

Alpine verwendet den Befehl adduserund addgroupzum Erstellen von Benutzern und Gruppen (anstelle von useraddund 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

Die Flags für addusersind:

Verwendung: adduser [OPTIONEN] USER [GROUP]

Erstellen Sie einen neuen Benutzer oder fügen Sie USER zur GROUP hinzu

        -h DIR Home-Verzeichnis
        -g GECOS GECOS-Feld
        -s SHELL Login-Shell
        -G GFK-Gruppe
        -S Erstellen Sie einen Systembenutzer
        -D Weisen Sie kein Passwort zu
        -H Erstelle kein Home-Verzeichnis
        -u UID Benutzer-ID
        -k SKEL Skeleton-Verzeichnis (/ etc / skel)

Fügen Sie neue offizielle Benutzerdokumente hinzu

Daniel Gartmann
quelle
7
Alternativ können Sie das gesamte obige Snippet durch Folgendes ersetzen: Dies USER 405ist der Gastbenutzer in Alpine Linux.
Daniel Gartmann
8
Warum nicht USER guest?
user672009
3
Ich würde mit dem Erstellen eines neuen Benutzers beginnen, da dieser Benutzer dieselbe UID / GID wie der auf dem Host-Betriebssystem haben soll, damit beim Ausführen von Docker unter Linux keine Berechtigungsprobleme auftreten. (kein Problem mit MacOS / Windows-Benutzern)
Elquimista
5
Man beachte , dass , da Alpine auf BusyBox beruht, ihre adduserund addgroupBefehle unterschiedlich sind adduserund addgroupwie von Debian und Ubuntu vorgesehen, die wiederum an vordere Enden useraddund groupadd. Insbesondere unterstützen die Befehle Debian und Ubuntu nur Langformoptionen. Siehe: manpages.debian.org/stretch/adduser/adduser.8.en.html
Jack
Ich habe bereits einen Docker-Container erstellt. Welchen Befehl muss ich jetzt ausführen, um einen Benutzer hinzuzufügen?
Aashish Kumar
60

Die Befehle sind adduserund addgroup.

Hier ist eine Vorlage für Docker, die Sie sowohl in Busybox-Umgebungen (alpine) als auch in Debian-basierten Umgebungen (Ubuntu usw.) verwenden können:

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

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

Beachte das Folgende:

  • --disabled-password verhindert die Aufforderung zur Eingabe eines Passworts
  • --gecos "" umgeht die Aufforderung zur Eingabe von "Vollständiger Name" usw. auf Debian-basierten Systemen
  • --home "$(pwd)"Setzt das Zuhause des Benutzers auf WORKDIR. Sie können dies nicht wollen.
  • --no-create-home verhindert, dass Cruft von in das Verzeichnis kopiert wird /etc/skel

In der Verwendungsbeschreibung für diese Anwendungen fehlen die langen Flags im Code für Adduser und Addgroup .

Die folgenden Langform-Flags sollten sowohl in alpinen als auch in Debian-Derivaten funktionieren:

Nutzer hinzufügen

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

Zu beachten ist, dass --ingroupdie GID entsprechend der UID zugewiesen wird, wenn sie nicht festgelegt ist. Wenn die der angegebenen UID entsprechende GID bereits vorhanden ist, schlägt der Adduser fehl.

Gruppe hinzufügen

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

All dies habe ich entdeckt, als ich versucht habe, meine eigene Alternative zum Fixuid- Projekt zum Ausführen von Containern als Host-UID / GID zu schreiben .

Mein Hilfsskript für den Einstiegspunkt finden Sie auf GitHub.

Das Skript soll als erstes Argument vorangestellt werden, ENTRYPOINTdas Docker veranlassen soll, UID und GID von einem relevanten Bind-Mount abzuleiten.

Eine Umgebungsvariable "TEMPLATE" kann erforderlich sein, um zu bestimmen, woher die Berechtigungen abgeleitet werden sollen.

(Zum Zeitpunkt des Schreibens habe ich keine Dokumentation für mein Skript. Es ist immer noch auf der ToDo-Liste !!)

rexypoo
quelle
8
+1: Die Verwendung einer langen Form für Befehlsargumente erhöht die Lesbarkeit und erleichtert die Wartung. Verwenden Sie beim Schreiben von Shell-Skripten immer die Langform (Dockerfile RUN ist nichts anderes als ein Shell-Skript).
Victor Schröder