Andrey Kopylov , unser technischer Direktor, liebt, nutzt und fördert Docker. In einem neuen Artikel spricht er darüber, wie Benutzer in Docker erstellt werden. Korrigieren Sie die Arbeit mit ihnen, warum Benutzer nicht mit Root-Rechten belassen werden können und wie das Problem der Nichtübereinstimmung von Bezeichnern in der Docker-Datei gelöst werden kann.
Alle Prozesse im Container werden als root ausgeführt, sofern nicht anders angegeben. Es scheint sehr praktisch, da dieser Benutzer keine Einschränkungen hat. Aus diesem Grund ist das Arbeiten unter der Wurzel aus Sicherheitsgründen falsch. Wenn auf dem lokalen Computer niemand, der bei klarem Verstand ist, mit Root-Rechten arbeitet, starten viele Prozesse unter dem Root in Containern.
Es gibt immer Fehler, die es der Malware ermöglichen, aus dem Container auf den Host-Computer zu gelangen. Unter der Annahme des Schlimmsten müssen wir sicherstellen, dass Prozesse innerhalb des Containers von einem Benutzer gestartet werden, der keine Rechte auf dem Hostcomputer hat.
Benutzererstellung
Das Erstellen eines Benutzers in einem Container unterscheidet sich nicht vom Erstellen in Linux-Distributionen. Bei unterschiedlichen Grundbildern können die Teams jedoch variieren.
Für debian-basierte Distributionen in der Docker-Datei müssen Sie Folgendes hinzufügen:
RUN groupadd --gid 2000 node \ && useradd --uid 2000 --gid node --shell /bin/bash --create-home node
Für Alpen:
RUN addgroup -g 2000 node \ && adduser -u 2000 -G node -s /bin/sh -D node
Prozesse vom Benutzer aus starten
Führen Sie Folgendes aus, um alle nachfolgenden Prozesse von einem Benutzer mit UID 2000 aus zu starten:
USER 2000
Führen Sie Folgendes aus, um alle nachfolgenden Prozesse vom Benutzerknoten aus zu starten:
USER node
Weitere Details in der Dokumentation .
Mounten von Volumes
Bieten Sie dem Benutzer beim Mounten von Volumes in einem Container die Möglichkeit, Dateien zu lesen und / oder zu schreiben. Dazu muss die UID (GID) des Benutzers im Container und des Benutzers außerhalb des Containers, der über die entsprechenden Zugriffsrechte auf die Datei verfügt, übereinstimmen. Gleichzeitig spielen Benutzernamen keine Rolle.
Auf einem Linux-Computer sind die Benutzer-UID und die GID häufig 1000. Diese Kennungen werden dem ersten Computerbenutzer zugewiesen.
Das Erhalten Ihrer Kennungen ist einfach:
id
Sie erhalten umfassende Informationen über Ihren Benutzer.
Ersetzen Sie 2000 der Beispiele durch Ihre Kennung und alles wird gut.
Weisen Sie Benutzer-UID und GID zu
Wenn der Benutzer früher erstellt wurde, die Bezeichner jedoch geändert werden müssen, können Sie dies folgendermaßen tun:
RUN usermod -u 1000 node \ && groupmod -g 1000 node
Wenn Sie das grundlegende Alpenbild verwenden, müssen Sie das Schattenpaket installieren:
RUN apk add —no-cache shadow
Übergabe der Benutzer-ID innerhalb des Containers beim Erstellen des Bildes
Wenn Ihre Kennung und die Kennungen aller Personen, die an dem Projekt arbeiten, identisch sind, geben Sie diese Kennung einfach in der Docker-Datei an. Häufig stimmen die Benutzerkennungen jedoch nicht überein.
Wie man das Gewünschte realisiert, ist nicht sofort klar. Für mich war es am schwierigsten, Docker zu beherrschen. Viele Docker-Benutzer glauben nicht, dass es verschiedene Phasen im Leben eines Bildes gibt. Zunächst wird das Bild dazu mit der Docker-Datei gesammelt. Wenn Sie einen Container von einem Dockerfile-Image aus starten, wird er nicht mehr verwendet.
Die Erstellung von Benutzern sollte beim Erstellen des Bildes erfolgen. Gleiches gilt für die Benutzerdefinition, von der aus Prozesse gestartet werden. Dies bedeutet, dass wir die UID (GID) irgendwie in den Container übergeben müssen.
Die Anweisungen ENV und ARG werden verwendet, um externe Variablen in der Docker-Datei zu verwenden. Einen detaillierten Vergleich der Richtlinien finden Sie hier .
Dockerfile
ARG UID=1000 ARG GID=1000 ENV UID=${UID} ENV GID=${GID} RUN usermod -u $UID node \ && groupmod -g $GID node
Sie können Argumente über Docker-Compose wie folgt übergeben:
Docker-Compose
build: context: ./src/backend args: UID: 1000 GID: 1000
PS Um alle Tricks von Docker zu beherrschen, reicht es nicht aus, Dokumentation oder Artikel zu lesen. Sie müssen viel üben, Sie müssen den Hafenarbeiter fühlen.