544 Stimmen

Wie füge ich Benutzer zu einem Docker-Container hinzu?

Ich habe einen Docker-Container mit einigen Prozessen (uwsgi und Celery), die darin ausgeführt werden. Ich möchte einen Celery-Benutzer und einen uwsgi-Benutzer für diese Prozesse erstellen, sowie eine Arbeitsgruppe, der sie beide angehören werden, um Berechtigungen zuzuweisen.

Ich habe versucht, RUN adduser uwsgi und RUN adduser celery zu meiner Docker-Datei hinzuzufügen, aber das verursacht Probleme, da diese Befehle eine Eingabeaufforderung anzeigen (ich habe die Antworten aus dem Build unten gepostet).

Was ist der beste Weg, Benutzer zu einem Docker-Container hinzuzufügen, um Berechtigungen für die im Container ausgeführten Worker festzulegen?

Mein Docker-Image wird von der offiziellen Ubuntu14.04-Basis erstellt.

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

Benutzer `uwsgi' hinzufügen ...
Neue Gruppe `uwsgi' hinzufügen (1000) ... 
Neuen Benutzer `uwsgi' (1000) mit Gruppe `uwsgi' hinzufügen ... 
Home-Verzeichnis `/home/uwsgi' erstellen ...
Dateien von `/etc/skel' kopieren ... 
[91mNeues UNIX-Passwort eingeben: Neues UNIX-Passwort erneut eingeben: [0m 
[91mpasswd: Authentifizierungs-Token-Manipulationsfehler
passwd: Passwort nicht geändert
[0m 
[91mVerwendung von nicht initialisierten Wert $answer in chop bei /usr/sbin/adduser Zeile 563.
[0m 
[91mVerwendung von nicht initialisiertem Wert $answer beim Musterabgleich (m//) bei /usr/sbin/adduser Zeile 564.
[0m 
Erneut versuchen? [j/N] 
Benutzerinformationen für uwsgi ändern
Den neuen Wert eingeben oder die Eingabetaste für den Standardwert drücken
    Vollständiger Name []: 
Raumnummer []:     Arbeitsnummer []:  Telefonnummer zuhause []:  Andere []: 
[91mVerwendung von nicht initialisiertem Wert $answer in chop bei /usr/sbin/adduser Zeile 589.
[0m 
[91mVerwendung des nicht initialisierten Wertes $answer im Musterabgleich (m//) bei /usr/sbin/adduser Zeile 590.
[0m 
Ist die Information korrekt? [J/n] 
---> 258f2f2f13df 
Zwischencontainer 59948863162a wird entfernt 
Schritt 5 : RUN adduser celery 
---> Ausführen in be06f1e20f64 
Benutzer `celery' hinzufügen ...
Neue Gruppe `celery' hinzufügen (1001) ... 
Neuen Benutzer `celery' (1001) mit Gruppe `celery' hinzufügen ... 
Home-Verzeichnis `/home/celery' erstellen ...
Dateien von `/etc/skel' kopieren ... 
[91mNeues UNIX-Passwort eingeben: Neues UNIX-Passwort erneut eingeben: [0m 
[91mpasswd: Authentifizierungs-Token-Manipulationsfehler
passwd: Passwort nicht geändert
[0m 
[91mVerwendung von nicht initialisierten Wert $answer in chop bei /usr/sbin/adduser Zeile 563.
[0m 
[91mVerwendung von nicht initialisiertem Wert $answer beim Musterabgleich (m//) bei /usr/sbin/adduser Zeile 564.
[0m 
Erneut versuchen? [j/N] 
Benutzerinformationen für celery ändern
Den neuen Wert eingeben oder die Eingabetaste für den Standardwert drücken
    Vollständiger Name []:   Raumnummer []:     Arbeitsnummer []: 
Telefonnummer zuhause []:  Andere []: 
[91mVerwendung von nicht initialisiertem Wert $answer in chop bei /usr/sbin/adduser Zeile 589.
[0m 
[91mVerwendung des nicht initialisierten Wertes $answer im Musterabgleich (m//) bei /usr/sbin/adduser Zeile 590.
[0m 
Ist die Information korrekt? [J/n]

851voto

Paul Staab Punkte 8590

Der Trick besteht darin, useradd anstelle seines interaktiven Wrappers adduser zu verwenden. Ich erstelle Benutzer normalerweise mit:

RUN useradd -ms /bin/bash neuerbenutzer

dies erstellt ein Home-Verzeichnis für den Benutzer und stellt sicher, dass bash die Standard-Shell ist.

Dann können Sie hinzufügen:

USER neuerbenutzer
WORKDIR /home/neuerbenutzer

zu Ihrem Dockerfile. Jeder Befehl danach sowie interaktive Sitzungen werden als Benutzer neuerbenutzer ausgeführt:

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

Sie müssen möglicherweise neuerbenutzer die Berechtigungen geben, die Programme auszuführen, die Sie ausführen möchten, bevor Sie den Benutzerbefehl aufrufen.

Die Verwendung von nicht privilegierten Benutzern in Containern ist aus Sicherheitsgründen eine gute Idee. Es hat jedoch einige Nachteile. Am wichtigsten ist, dass Personen, die Abbilder von Ihrem Abbild ableiten, wieder zum Root wechseln müssen, bevor sie Befehle mit Superuser-Berechtigungen ausführen können.

260voto

kenorb Punkte 134883

Ubuntu

Probieren Sie die folgenden Zeilen in der Dockerfile aus:

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

useradd Optionen (siehe: man useradd):

  • -r, --system Erstelle ein Systemkonto. siehe: Auswirkungen beim Erstellen von Systemkonten
  • -m, --create-home Erstelle das Home-Verzeichnis des Benutzers.
  • -d, --home-dir HOME_DIR Home-Verzeichnis des neuen Kontos.
  • -s, --shell SHELL Anmelde-Shell des neuen Kontos.
  • -g, --gid GROUP Name oder ID der primären Gruppe.
  • -G, --groups GROUPS Liste der zusätzlichen Gruppen.
  • -u, --uid UID Benutzer-ID angeben. siehe: Verstehen, wie uid und gid in Docker-Containern funktionieren
  • -p, --password PASSWORD Verschlüsseltes Passwort des neuen Kontos (z.B. ubuntu).

Standardbenutzerpasswort festlegen

Um das Benutzerpasswort festzulegen, fügen Sie -p "$(openssl passwd -1 ubuntu)" dem useradd-Befehl hinzu.

Fügen Sie alternativ die folgenden Zeilen Ihrer Dockerfile hinzu:

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

Die erste shell-Anweisung dient dazu sicherzustellen, dass die -o pipefail-Option aktiviert ist, bevor ein RUN-Befehl mit einem Pipe ausgeführt wird. Erfahren Sie mehr: Hadolint: Überprüfen Ihrer Dockerfile.

123voto

Raffael Punkte 2217

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

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

Der --gecos Parameter wird verwendet, um zusätzliche Informationen festzulegen. In diesem Fall ist es einfach leer.

Bei Systemen mit Busybox (wie Alpine) verwenden Sie

RUN adduser -D -g '' newuser

Siehe busybox adduser

40voto

S.Mishra Punkte 2963

Das Hinzufügen eines Benutzers in Docker und das Ausführen Ihrer App unter diesem Benutzer ist aus Sicherheitssicht sehr empfehlenswert. Um dies zu tun, würde ich die folgenden Schritte empfehlen:

VON Knoten: 10-Alpine

# Quelle in den Container kopieren
RUN mkdir -p /usr/app/src

# Quellcode kopieren
COPY src /usr/app/src
COPY package.json /usr/app
COPY package-lock.json /usr/app

WORKDIR /usr/app

# Das Ausführen von npm install für produktionszwecke wird keine Entwicklungsabhängigkeiten ausführen.
RUN npm install -only=production    

# Eine Benutzergruppe 'xyzgroup' erstellen
RUN addgroup -S xyzgroup

# Einen Benutzer 'appuser' unter 'xyzgroup' erstellen
RUN adduser -S -D -h /usr/app/src appuser xyzgroup

# Alle Dateien dem App-Benutzer zuweisen.
RUN chown -R appuser:xyzgroup /usr/app

# Zu 'appuser' wechseln
BENUTZER appuser

# Den zugeordneten Port öffnen
BELICHTEN 3000

# Den Prozess starten
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 für den Benutzer des Projektordners, das Wechseln zum neu erstellten Benutzer und das Ausführen der App unter diesem Benutzer.

30voto

Ryan Miao Punkte 471

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

Node: node12-github

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

superset: superset-github

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

Ich denke, das ist ein guter Weg, um Open Source zu unterstützen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X