Wie füge ich Benutzer zum Docker-Container hinzu?


285

Ich habe einen Docker-Container mit einigen Prozessen (Uwsgi und Sellerie). Ich möchte einen Sellerie-Benutzer und einen UWSGI-Benutzer für diese Prozesse sowie eine Arbeitsgruppe erstellen, zu der beide gehören, um Berechtigungen zuzuweisen.

Ich habe versucht, RUN adduser uwsgiund RUN adduser celeryzu meiner Docker-Datei hinzuzufügen, aber dies verursacht Probleme, da diese Befehle zur Eingabe auffordern (ich habe die Antworten aus dem folgenden Build veröffentlicht).

Wie können Benutzer am besten zu einem Docker-Container hinzugefügt werden, um Berechtigungen für Mitarbeiter festzulegen, die im Container ausgeführt werden?

Mein Docker-Image basiert auf der offiziellen Ubuntu14.04-Basis.

Hier ist die Ausgabe der Docker-Datei, wenn die Adduser-Befehle ausgeführt werden:

Adding user `uwsgi' ...
Adding new group `uwsgi' (1000) ... 
Adding new user `uwsgi' (1000) with group `uwsgi' ... 
Creating home directory `/home/uwsgi' ...
Copying files from `/etc/skel' ... 
[91mEnter new UNIX password: Retype new UNIX password: [0m 
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m 
Try again? [y/N] 
Changing the user information for uwsgi
Enter the new value, or press ENTER for the default
    Full Name []: 
Room Number []:     Work Phone []:  Home Phone []:  Other []: 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m 
Is the information correct? [Y/n] 
---> 258f2f2f13df 
Removing intermediate container 59948863162a 
Step 5 : RUN adduser celery 
---> Running in be06f1e20f64 
Adding user `celery' ...
Adding new group `celery' (1001) ... 
Adding new user `celery' (1001) with group `celery' ... 
Creating home directory `/home/celery' ...
Copying files from `/etc/skel' ... 
[91mEnter new UNIX password: Retype new UNIX password: [0m 
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m 
Try again? [y/N] 
Changing the user information for celery
Enter the new value, or press ENTER for the default
    Full Name []:   Room Number []:     Work Phone []: 
Home Phone []:  Other []: 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m 
Is the information correct? [Y/n] 

Antworten:


489

Der Trick besteht darin, useraddanstelle des interaktiven Wrappers zu verwenden adduser. Normalerweise erstelle ich Benutzer mit:

RUN useradd -ms /bin/bash newuser

Dadurch wird ein Home-Verzeichnis für den Benutzer erstellt und sichergestellt, dass Bash die Standard-Shell ist.

Sie können dann hinzufügen:

USER newuser
WORKDIR /home/newuser

zu Ihrer Docker-Datei. Jeder nachfolgende Befehl sowie interaktive Sitzungen werden als Benutzer ausgeführt newuser:

docker run -t -i image
newuser@131b7ad86360:~$

Möglicherweise müssen Sie newuserdie Berechtigungen zum Ausführen der Programme erteilen , die Sie ausführen möchten, bevor Sie den Benutzerbefehl aufrufen.

Die Verwendung nicht privilegierter Benutzer in Containern ist aus Sicherheitsgründen eine gute Idee. Es hat auch einige Nachteile. Am wichtigsten ist, dass Personen, die Bilder von Ihrem Bild ableiten, wieder zu root wechseln müssen, bevor sie Befehle mit Superuser-Berechtigungen ausführen können.


141
Ich würde empfehlen, die vollständigen Namensoptionen in einer Docker-Datei wie in einem Skript anstelle der kurzen zu verwenden (mehr, wenn IMO interaktiv verwendet wird). useradd --create-home --shell /bin/bashist für Mitarbeiter verständlicher / lesbarer.
Baptiste Mathus

25
Um das Passwort festzulegen, können Sie chpasswd wie folgt verwenden:RUN echo 'newuser:newpassword' | chpasswd
iuridiniz

3
Beachten Sie, dass Docker beim Erstellen eines neuen Benutzers mit einer großen Benutzer-ID möglicherweise hängen bleibt / abstürzt, wenn versucht wird, das Lastlog zu erstellen - eine massive Datei mit geringer Dichte . Vermeiden Sie dies mit der --no-log-initOption zu useradd.
DavidA

10
Netter Tipp, @iuridiniz! Vergiss nicht, es vorher anzurufen USER newuser. Wenn der Benutzer auch über Root-Rechte verfügen muss, können Sie auch einschließen adduser <username> sudo.
Yamaneko

6
/bin/sh: useradd: not foundAlpin Linux
Deathangel908

91

Um die interaktiven Fragen von adduser zu vermeiden, können Sie sie mit folgenden Parametern aufrufen:

RUN adduser --disabled-password --gecos '' newuser

Mit dem --gecosParameter werden die zusätzlichen Informationen festgelegt. In diesem Fall ist es nur leer.

Verwenden Sie auf Systemen mit Busybox (wie Alpine)

RUN adduser -D -g '' newuser

Siehe Busybox-Adduser


3
Vielen Dank! Es sieht so aus, als ob eine adduserLösung auf hoher Ebene im Allgemeinen der Verwendung von Funktionen auf niedriger Ebene wie z useradd.
Akhmed

adduser: unrecognized option: gecosAuf Alpine scheint das nicht zu funktionieren.
weberc2

Was macht das --disabled-Passwort und wie können wir das Passwort für den Benutzer gleichzeitig in der Docker-Datei festlegen?
Hossein

72

Ubuntu

Versuchen Sie die folgenden Zeilen in Dockerfile:

RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1001 ubuntu
USER ubuntu
WORKDIR /home/ubuntu

useraddOptionen (siehe :) man useradd:

Festlegen des Standardbenutzerkennworts

Fügen Sie zum Festlegen des Benutzerkennworts -p "$(openssl passwd -1 ubuntu)"den useraddBefehl hinzu.

Alternativ können Sie die folgenden Zeilen zu Ihrem hinzufügen Dockerfile:

SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd

Die erste Shell-Anweisung besteht darin, sicherzustellen, dass die -o pipefailOption zuvor RUNmit einer Pipe aktiviert wurde . Lesen Sie mehr: Hadolint: Flusen Sie Ihre Docker-Datei .


2
Warum sollte der Benutzer in der Stammgruppe sein? Ist es nicht der
springende

5
@ Novaterata Abhängig von der Verwendung. rootDie Gruppe gibt nicht an, dass sie Root-Zugriff haben, sondern nur, dass sie mehr Lesezugriff auf einige Dateien (z. B. Protokolle) haben. Dies ist nützlich, hängt jedoch vom Projekt ab.
Kenorb

Ich kann sehen, dass dies funktioniert. Ich bin automatisch als Benutzer angemeldet, generiere aber immer noch Dateien, die root gehören. Ich habe sogar gerade 'USER user' verwendet, da mein Benutzername für den lokalen Benutzer und die Gruppe 'user' ist. Generiert weiterhin Root-Dateien. Gibt es noch etwas, was ich tun sollte? Ich mache im Grunde einen Docker-Container, der unsere Codebasis kompiliert. Es checkt also Code aus svn aus und richtet Variablen mithilfe der Bash-Quelle ein. Könnten Bash-Befehle Dinge als root ausführen, selbst wenn ich nie nach dem root-Passwort gefragt werde?
JoeManiaci

14

Das Hinzufügen eines Benutzers im Docker und das Ausführen Ihrer App unter diesem Benutzer ist aus Sicherheitsgründen eine sehr gute Vorgehensweise. Dazu würde ich folgende Schritte empfehlen:

FROM node:10-alpine

# Copy source to container
RUN mkdir -p /usr/app/src

# Copy source code
COPY src /usr/app/src
COPY package.json /usr/app
COPY package-lock.json /usr/app

WORKDIR /usr/app

# Running npm install for production purpose will not run dev dependencies.
RUN npm install -only=production    

# Create a user group 'xyzgroup'
RUN addgroup -S xyzgroup

# Create a user 'appuser' under 'xyzgroup'
RUN adduser -S -D -h /usr/app/src appuser xyzgroup

# Chown all the files to the app user.
RUN chown -R appuser:xyzgroup /usr/app

# Switch to 'appuser'
USER appuser

# Open the mapped port
EXPOSE 3000

# Start the process
CMD ["npm", "start"]

Die obigen Schritte sind ein vollständiges Beispiel für das Kopieren von NodeJS-Projektdateien, das Erstellen einer Benutzergruppe und eines Benutzers, das Zuweisen von Berechtigungen zum Benutzer für den Projektordner, das Wechseln zum neu erstellten Benutzer und das Ausführen der App unter diesem Benutzer.


1
addgroup ist für mich fehlgeschlagen, Schritt 11/15: RUN addgroup -S Benutzername ---> Ausführen in db9fd22d469d Option s ist mehrdeutig (Shell, System) adduser [--home DIR] [--shell SHELL] [--no-create -home] [--uid ID] [--firstuid ID] [--lastuid ID] [--gecos GECOS] [--ingroup GROUP | --gid ID] [--disabled-password] [--disabled-login] [--encrypt-home] BENUTZER Hinzufügen eines normalen Benutzers
Teoring

9

Sie können Open Source Dockerfile imitieren, zum Beispiel:

Knoten: Knoten 12-Github

RUN groupadd --gid 1000 node \
    && useradd --uid 1000 --gid node --shell /bin/bash --create-home node

Obermenge: Obermenge-Github

RUN useradd --user-group --create-home --no-log-init --shell /bin/bash 
    superset

Ich denke, es ist eine gute Möglichkeit, Open Source zu folgen.


3

Jeder hat seinen persönlichen Favoriten, und das ist meiner:

RUN useradd --user-group --system --create-home --no-log-init app
USER app

Referenz: man useradd

Die RUNZeile fügt den Benutzer und die Gruppe hinzu app:

root@ef3e54b60048:/# id app
uid=999(app) gid=999(app) groups=999(app)

Verwenden Sie einen spezifischeren Namen, als appwenn das Bild als Basisbild wiederverwendet werden soll. Nebenbei, fügen --shell /bin/bashSie hinzu , wenn Sie wirklich brauchen.


Teilkredit: Antwort von Ryan M.


1

Alternativ können Sie dies auch tun.

RUN addgroup demo && adduser -DH -G demo demo

Der erste Befehl erstellt eine Gruppe namens Demo . Der zweite Befehl erstellt einen Demo- Benutzer und fügt ihn der zuvor erstellten Demo- Gruppe hinzu.

Flags steht für:

-G Group
-D Don't assign password
-H Don't create home directory

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.