it-swarm.com.de

Benutzer zu Docker-Container hinzufügen

Ich habe einen Docker-Container, in dem einige Prozesse (uwsgi und Sellerie) laufen. Ich möchte einen Sellerie-Benutzer und einen Uwsgi-Benutzer für diese Prozesse sowie eine Worker-Gruppe erstellen, der beide angehören, um Berechtigungen zuzuweisen. 

Ich habe versucht, RUN adduser uwsgi und RUN adduser celery zu meiner Dockerfile hinzuzufügen, was jedoch zu Problemen führt, da diese Befehle zur Eingabe auffordern (ich habe die Antworten aus dem Build unten gepostet). 

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

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

Hier ist die Ausgabe aus 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] 
173
rfj001

Der Trick ist, useradd anstelle des interaktiven Wrappers adduser..__ zu verwenden. Ich erstelle Benutzer mit:

RUN useradd -ms /bin/bash newuser

dadurch wird ein Basisverzeichnis für den Benutzer erstellt und sichergestellt, dass Bash die Standardshell ist. 

Sie können dann hinzufügen:

USER newuser
WORKDIR /home/newuser

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

docker run -t -i image
[email protected]:~$

Möglicherweise müssen Sie newuser die Berechtigungen erteilen, um die Programme auszuführen, 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 jedoch, dass Personen, die Bilder von Ihrem Image ableiten, wieder zum Root wechseln müssen, bevor sie Befehle mit Superuser-Berechtigungen ausführen können.

319
Paul Staab

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

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

Mit dem Parameter --gecos werden die zusätzlichen Informationen festgelegt. In diesem Fall ist es einfach leer.

Verwenden Sie auf Systemen mit Busybox (wie Alpine) 

RUN adduser -D -g '' newuser

Siehe busybox adduser

67
Raffael

Ubuntu

Versuchen Sie die folgenden Zeilen in Dockerfile:

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

useradd Optionen (siehe: man useradd):

  • -r, --system Erstellen Sie ein Systemkonto. siehe: Auswirkungen beim Erstellen von Systemkonten
  • -m, --create-home Erstellen Sie das Basisverzeichnis des Benutzers.
  • -d, --home-dir HOME_DIR Heimatverzeichnis des neuen Kontos.
  • -s, --Shell SHELL Login-Shell des neuen Kontos.
  • -g, --gid GROUP Name oder ID der primären Gruppe.
  • -G, --groups GROUPS Liste der ergänzenden Gruppen.
  • -u, --uid UID Geben Sie die Benutzer-ID an. see: Verstehen, wie uid und gid in Docker-Containern funktionieren
  • -p, --password PASSWORD Das verschlüsselte Passwort des neuen Kontos (z. B. ubuntu).

    Fügen Sie zum Festlegen des Kennworts den obigen Befehl hinzu: -p "$(openssl passwd -1 ubuntu)".

27
kenorb

Fügen Sie diese Zeile zu Ihrer Dockerfile hinzu (Sie können jeden Linux-Befehl auf diese Weise ausführen)

RUN useradd -ms /bin/bash yourNewUserName
2
Karl Morrison

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

Knoten: 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, es ist eine gute Möglichkeit, Open Source zu folgen.

1
Ryan Miao

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 Zeile RUN fügt den Benutzer und die Gruppe app hinzu:

[email protected]:/# id app
uid=999(app) gid=999(app) groups=999(app)

Verwenden Sie einen genaueren Namen als app, wenn das Image als Basisimage wiederverwendet werden soll. Nehmen Sie auch --Shell /bin/bash auf, wenn Sie es wirklich brauchen.


Teilgutschrift: Antwort von Ryan M

0
Acumenus

Das Hinzufügen eines Benutzers im Andockfenster und das Ausführen Ihrer App unter diesem Benutzer ist aus Sicherheitsgründen eine sehr gute Vorgehensweise. Dazu würde ich die folgenden 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 für den Projektordner für den Projektordner, das Wechseln zu dem neu erstellten Benutzer und das Ausführen der App unter diesem Benutzer.

0
S.Mishra