Einen Nicht-Root-Benutzer zu einem Container hinzufügen
Viele Docker-Images verwenden root als Standardbenutzer. Es gibt jedoch Fälle, in denen Sie möglicherweise einen Nicht-Root-Benutzer bevorzugen. Wenn Sie dies tun, gibt es einige Besonderheiten bei lokalen Dateisystem-Mounts (Bind-Mounts), die Sie kennen sollten. Speziell
-
Docker Desktop für Mac: Innerhalb des Containers verhalten sich alle gemounteten Dateien/Ordner so, als wären sie im Besitz des von Ihnen angegebenen Container-Benutzers. Lokal werden alle Dateisystemoperationen stattdessen die Berechtigungen Ihres lokalen Benutzers verwenden.
-
Docker Desktop für Windows: Innerhalb des Containers werden alle gemounteten Dateien/Ordner so angezeigt, als wären sie im Besitz von
root, aber der von Ihnen angegebene Benutzer kann sie trotzdem lesen/schreiben, und alle Dateien sind ausführbar. Lokal werden alle Dateisystemoperationen stattdessen die Berechtigungen Ihres lokalen Benutzers verwenden. Dies liegt daran, dass es grundsätzlich keine Möglichkeit gibt, Windows-Dateiberechtigungen direkt auf Linux abzubilden. -
Docker CE/EE unter Linux: Innerhalb des Containers haben alle gemounteten Dateien/Ordner genau die gleichen Berechtigungen wie außerhalb des Containers – einschließlich der Benutzer-ID (UID) und Gruppen-ID (GID) des Besitzers. Daher muss Ihr Container-Benutzer entweder die gleiche UID haben oder sich in einer Gruppe mit der gleichen GID befinden. Der tatsächliche Name des Benutzers / der Gruppe spielt keine Rolle. Der erste Benutzer auf einem Computer erhält typischerweise eine UID von 1000, daher verwenden die meisten Container diese als ID des Benutzers, um dieses Problem zu vermeiden.
Einen Benutzer für VS Code angeben
Wenn das von Ihnen verwendete Image oder Dockerfile bereits einen optionalen Nicht-Root-Benutzer bereitstellt (wie das node-Image), aber immer noch root als Standard verwendet, können Sie festlegen, dass Visual Studio Code (Server) und alle Unterprozesse (Terminals, Aufgaben, Debugging) diesen verwenden, indem Sie die Eigenschaft remoteUser in devcontainer.json angeben.
"remoteUser": "user-name-goes-here"
Unter Linux, wenn Sie in devcontainer.json auf ein Dockerfile, ein Image oder Docker Compose verweisen, wird auch automatisch die UID/GID des Container-Benutzers an die Ihres lokalen Benutzers angepasst, um das Berechtigungsproblem bei Bind-Mounts in dieser Umgebung zu vermeiden (es sei denn, Sie setzen "updateRemoteUserUID": false).
Da diese Einstellung nur VS Code und zugehörige Unterprozesse betrifft, muss VS Code neu gestartet werden (oder das Fenster neu geladen werden), damit sie wirksam wird. UID/GID-Updates werden jedoch nur angewendet, wenn der Container erstellt wird, und erfordern ein erneutes Erstellen, um eine Änderung zu erzielen.
Den Standard-Containerbenutzer angeben
In einigen Fällen müssen alle Prozesse im Container als ein anderer Benutzer ausgeführt werden (z. B. aufgrund von Startanforderungen) und nicht nur VS Code. Wie Sie dies tun, variiert geringfügig, je nachdem, ob Sie Docker Compose verwenden oder nicht.
-
Dockerfile und Image: Fügen Sie die Eigenschaft
containerUserzu dieser Datei hinzu."containerUser": "user-name-goes-here"Unter Linux wird, wie bei
remoteUser, auch hier automatisch die UID/GID des Container-Benutzers an die Ihres lokalen Benutzers angepasst, um das Berechtigungsproblem bei Bind-Mounts in dieser Umgebung zu vermeiden (es sei denn, Sie setzen"updateRemoteUserUID": false). -
Docker Compose: Aktualisieren Sie Ihre
docker-compose.yml(oder erweitern Sie sie) mit Folgendem für den entsprechenden Dienst:user: user-name-or-UID-goes-here
Einen Nicht-Root-Benutzer erstellen
Während alle Images oder Dockerfiles, die von der Dev Containers-Erweiterung stammen, einen Nicht-Root-Benutzer mit einer UID/GID von 1000 enthalten (typischerweise entweder vscode oder node genannt), tun dies viele Basis-Images und Dockerfiles nicht. Glücklicherweise können Sie ein Dockerfile aktualisieren oder erstellen, das einen Nicht-Root-Benutzer zu Ihrem Container hinzufügt.
Ihre Anwendung als Nicht-Root-Benutzer auszuführen, wird selbst in der Produktion empfohlen (da es sicherer ist), sodass dies auch dann eine gute Idee ist, wenn Sie ein bestehendes Dockerfile wiederverwenden. Beispielsweise erstellt dieser Ausschnitt für einen Debian/Ubuntu-Container einen Benutzer namens user-name-goes-here, gibt ihm die Fähigkeit, sudo zu verwenden, und legt ihn als Standard fest.
ARG USERNAME=user-name-goes-here
ARG USER_UID=1000
ARG USER_GID=$USER_UID
# Create the user
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
#
# [Optional] Add sudo support. Omit if you don't need to install software after connecting.
&& apt-get update \
&& apt-get install -y sudo \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME
# ********************************************************
# * Anything else you want to do like clean up goes here *
# ********************************************************
# [Optional] Set the default user. Omit if you want to keep the default as root.
USER $USERNAME
Tipp: Wenn Sie beim Erstellen einen Fehler bezüglich bereits vorhandener GID oder UID erhalten, hat das von Ihnen ausgewählte Image wahrscheinlich bereits einen Nicht-Root-Benutzer, den Sie direkt nutzen können.
In beiden Fällen, wenn Sie den Container bereits erstellt und sich damit verbunden haben, führen Sie Dev Containers: Rebuild Container aus der Befehlspalette (F1) aus, um die Änderung zu übernehmen. Andernfalls führen Sie Dev Containers: Open Folder in Container... aus, um eine Verbindung zum Container herzustellen.
Die UID/GID eines vorhandenen Container-Benutzers ändern
Während die Eigenschaft remoteUser versucht, die UID/GID unter Linux automatisch anzupassen, wenn ein Dockerfile oder Image verwendet wird, können Sie diesen Ausschnitt in Ihrem Dockerfile verwenden, um die UID/GID eines Benutzers stattdessen manuell zu ändern. Aktualisieren Sie die ARG-Werte entsprechend.
ARG USERNAME=user-name-goes-here
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupmod --gid $USER_GID $USERNAME \
&& usermod --uid $USER_UID --gid $USER_GID $USERNAME \
&& chown -R $USER_UID:$USER_GID /home/$USERNAME
Beachten Sie, dass Sie unter Alpine Linux zuerst das Paket shadow installieren müssen.
RUN apk add --no-cache shadow