Standardmäßig beim Ausführen
docker run -it [myimage]
ODER
docker attach [mycontainer]
Sie stellen als Root-Benutzer eine Verbindung zum Terminal her, aber ich möchte eine Verbindung als anderer Benutzer herstellen. Ist das möglich?
Standardmäßig beim Ausführen
docker run -it [myimage]
ODER
docker attach [mycontainer]
Sie stellen als Root-Benutzer eine Verbindung zum Terminal her, aber ich möchte eine Verbindung als anderer Benutzer herstellen. Ist das möglich?
su user_name
Antworten:
Für docker run
:
Fügen Sie einfach die Option --user <user>
zum Wechseln zu einem anderen Benutzer hinzu, wenn Sie den Docker-Container starten.
docker run -it --user nobody busybox
Für docker attach
oder docker exec
:
Da der Befehl zum Anhängen / Ausführen an den vorhandenen Prozess verwendet wird, wird der aktuelle Benutzer dort direkt verwendet.
docker run -it busybox # CTRL-P/Q to quit
docker attach <container id> # then you have root user
/ # id
uid=0(root) gid=0(root) groups=10(wheel)
docker run -it --user nobody busybox # CTRL-P/Q to quit
docker attach <container id>
/ $ id
uid=99(nobody) gid=99(nogroup)
Wenn Sie wirklich eine Verbindung zu dem Benutzer herstellen möchten, den Sie haben möchten, dann
run --user <user>
oder erwähnen Sie ihn in Ihrer Dockerfile
VerwendungUSER
Sie können eine Shell in einem laufenden Docker-Container mit einem Befehl wie dem folgenden ausführen:
docker exec -it --user root <container id> /bin/bash
--user
Option kann weggelassen werden, wenn Befehle als root ausgeführt werden müssen, nehme ich an.
USER
Anweisung angepasst werden kann , siehe docs.docker.com/engine/reference/builder/#user
Sie können USER
in der Docker-Datei angeben . Alle nachfolgenden Aktionen werden mit diesem Konto ausgeführt. Sie können USER
eine Zeile vor dem CMD
oder angeben, ENTRYPOINT
wenn Sie diesen Benutzer nur beim Starten eines Containers verwenden möchten (und nicht beim Erstellen des Bildes). Wenn Sie einen Container aus dem resultierenden Bild starten, werden Sie als angegebener Benutzer angehängt.
Der einzige Weg, wie ich es zum Laufen bringen kann, ist:
docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v `pwd`:/siem mono bash
su - magnus
Daher muss ich sowohl die Umgebungsvariable $ USER als auch einen Punkt in der Datei / etc / passwd angeben. Auf diese Weise kann ich im Ordner / siem kompilieren und dort das Eigentum an Dateien behalten, die nicht als root vorliegen.
Meine Lösung:
#!/bin/bash
user_cmds="$@"
GID=$(id -g $USER)
UID=$(id -u $USER)
RUN_SCRIPT=$(mktemp -p $(pwd))
(
cat << EOF
addgroup --gid $GID $USER
useradd --no-create-home --home /cmd --gid $GID --uid $UID $USER
cd /cmd
runuser -l $USER -c "${user_cmds}"
EOF
) > $RUN_SCRIPT
trap "rm -rf $RUN_SCRIPT" EXIT
docker run -v $(pwd):/cmd --rm my-docker-image "bash /cmd/$(basename ${RUN_SCRIPT})"
Auf diese Weise kann der Benutzer beliebige Befehle mit den von bereitgestellten Tools ausführen my-docker-image
. Beachten Sie, wie das aktuelle Arbeitsverzeichnis des Benutzers auf dem Volume /cmd
im Container bereitgestellt wird.
Ich verwende diesen Workflow, um meinem Entwicklerteam das Cross-Kompilieren von C / C ++ - Code für das arm64-Ziel zu ermöglichen, dessen BSP ich verwalte (das my-docker-image
enthält den Cross-Compiler, Sysroot, make, cmake usw.). Damit kann ein Benutzer einfach Folgendes tun:
cd /path/to/target_software
cross_compile.sh "mkdir build; cd build; cmake ../; make"
Wo cross_compile.sh
ist das oben gezeigte Skript? Die addgroup/useradd
Maschinerie ermöglicht dem Benutzer das Eigentum an allen Dateien / Verzeichnissen, die durch den Build erstellt wurden.
Während das bei uns funktioniert. Es scheint irgendwie hacky. Ich bin offen für alternative Implementierungen ...
Befehl als WWW-Datenbenutzer ausführen: docker exec -t --user www-data container bash -c "ls -la"
Als aktualisierte Antwort aus dem Jahr 2020. --user lautet die Option -u Benutzername oder UID (Format: <name | uid> [: <group | gid>]).
Dann funktioniert es bei mir so,
docker exec -it -u root:root container /bin/bash
Referenz: https://docs.docker.com/engine/reference/commandline/exec/
Dies löste meinen Anwendungsfall: "Kompilieren Sie Webpack-Inhalte im nodejs-Container unter Windows, auf dem Docker Desktop mit WSL2 ausgeführt wird, und haben Sie die erstellten Assets unter Ihrem aktuell angemeldeten Benutzer."
docker run -u 1000 -v "$PWD":/build -w /build node:10.23 /bin/sh -c 'npm install && npm run build'
Basierend auf der Antwort durch Eigenfeld . Vielen Dank!
Auch dieses Material hat mir geholfen zu verstehen, was los ist.
docker run --user user_name