Stellen Sie eine Verbindung zum Docker-Container als anderer Benutzer als root her

80

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?

Andy59469
quelle
3
Ja. docker run --user user_name
Xiongbing Jin
1
Es gibt keine solche Option zum Anhängen. Sie müssen sich als root anmelden und dannsu user_name
Xiongbing Jin

Antworten:

88

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 attachoder 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

  1. Beginnen Sie mit diesem Benutzer run --user <user>oder erwähnen Sie ihn in Ihrer DockerfileVerwendungUSER
  2. Ändern Sie den Benutzer mit `su
Larry Cai
quelle
65

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

Jason
quelle
2
root ist der Standardbenutzer. --userOption kann weggelassen werden, wenn Befehle als root ausgeführt werden müssen, nehme ich an.
Stphane
5
@Stphane das ist nicht immer der Fall, da der Standardbenutzer in Dockerfile über die USERAnweisung angepasst werden kann , siehe docs.docker.com/engine/reference/builder/#user
ryenus
5

Sie können USERin der Docker-Datei angeben . Alle nachfolgenden Aktionen werden mit diesem Konto ausgeführt. Sie können USEReine Zeile vor dem CMDoder angeben, ENTRYPOINTwenn 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.

kliew
quelle
Vergessen Sie auch nie, HOME
karthik101
2

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.

Eigenfeld
quelle
Hat nicht "wie es ist" funktioniert, sondern mich auf eine funktionierende Lösung verwiesen. Vielen Dank!
Josef Sábl
1

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 /cmdim 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-imageenthä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.shist das oben gezeigte Skript? Die addgroup/useraddMaschinerie 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 ...

rmccabe3701
quelle
0

Befehl als WWW-Datenbenutzer ausführen: docker exec -t --user www-data container bash -c "ls -la"

Vasili Pascal
quelle
0

Für docker-compose. In der docker-compose.yml:

version: '3'
services:
    app:
        image: ...
        user: ${UID:-0}
...

In .env:

UID=1000
x-yuri
quelle
0

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/

Nurhun
quelle
0

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.

Josef Sábl
quelle