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.
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)
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:
--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 .
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 !!)
+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).
USER 405
ist der Gastbenutzer in Alpine Linux.USER guest
?adduser
undaddgroup
Befehle unterschiedlich sindadduser
undaddgroup
wie von Debian und Ubuntu vorgesehen, die wiederum an vordere Endenuseradd
undgroupadd
. Insbesondere unterstützen die Befehle Debian und Ubuntu nur Langformoptionen. Siehe: manpages.debian.org/stretch/adduser/adduser.8.en.htmlDie Befehle sind
adduser
undaddgroup
.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:
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
Zu beachten ist, dass
--ingroup
die 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
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,
ENTRYPOINT
das 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 !!)
quelle