Root-Passwort in einem Docker-Container

263

Ich verwende ein Docker-Image, das mit dem Befehl USER erstellt wurde, um einen Nicht-Root-Benutzer namens zu verwenden dev. In einem Container bin ich "dev", aber ich möchte die /etc/hostsDatei bearbeiten .

Also muss ich root sein. Ich versuche den Befehl su, werde aber aufgefordert, das Root-Passwort einzugeben.

Wie lautet das Standardkennwort des Root-Benutzers in einem Docker-Container?

Guillaume
quelle
11
einfach als root ausführen : docker exec -u 0 -it mycontainer bash. (siehe H6Antwort)
Sławomir Lenart

Antworten:

494

Sie können sich beim Docker-Container mit dem Root-Benutzer (ID = 0) anstelle des angegebenen Standardbenutzers anmelden, wenn Sie die -uOption verwenden. Z.B

docker exec -u 0 -it mycontainer bash

root (id = 0) ist der Standardbenutzer in einem Container. Der Bildentwickler kann zusätzliche Benutzer erstellen. Diese Benutzer sind über den Namen erreichbar. Bei der Übergabe einer numerischen ID muss der Benutzer nicht im Container vorhanden sein.

aus der Docker-Dokumentation

H6.
quelle
5
Es wäre schön anzugeben, dass mycontainer in dem Moment betriebsbereit sein muss, in dem Sie das obige Kommando eingeben. Es funktioniert mit 2 verschiedenen Terminals: eines für mycontainer und das andere für diesen Befehl. Andernfalls muss mycontainer als getrennt ausgeführt werden.
nicolimo86
6
Verwenden Sie für Bilderdocker run -u 0 -it mycontainer bash
Pavel 'PK' Kaminsky
2
Dies ist die Antwort, die oben sein sollte
D Pinto
1
@ High6, wenn Sie sagen "Sie können sich beim Docker-Image anmelden ...", meinen Sie "Sie können sich beim Docker- Container anmelden ".
lmiguelvargasf
Ist das immer möglich Oder kann dies blockiert werden?
Sam Thomas
81

Schließlich habe ich beschlossen, meine Docker-Images neu zu erstellen, damit ich das Root-Passwort durch etwas ändere, das ich weiß.

RUN echo 'root:Docker!' | chpasswd

oder

RUN echo 'Docker!' | passwd --stdin root 
Guillaume
quelle
5
Ich habe es versucht, aber es funktioniert nicht auf meinem CentOS 6-basierten Docker. Funktioniert dieser Befehl unter CentOS-basiertem Docker?
Dragan Nikolic
28

Es gibt verschiedene Möglichkeiten, dies zu tun.

  1. So führen Sie den Docker aus, indem Sie die USER-Einstellung überschreiben

    docker exec -u 0 -it containerName bash
    

oder

docker exec -u root -it --workdir / <containerName> bash
  1. Nehmen Sie während des Image-Builds in der Docker-Datei die erforderlichen Dateiberechtigungen usw. vor

  2. Wenn alle Pakete in Ihrem Linux-Image verfügbar sind, chpasswdin der Docker-Datei vor dem USER-Dienstprogramm.

Muralidharan.rade
quelle
23

Ich kann es mit dem folgenden Befehl zum Laufen bringen.

root@gitnew:# docker exec -it --user $(username) $(containername) /bin/bash
Mansur Ali
quelle
18

Ich hatte genau das Problem, dass ich nicht in der Lage war, root zu werden, weil ich als nicht privilegierter Benutzer im Container ausgeführt wurde.

Aber ich wollte kein neues Image erstellen, wie aus den vorherigen Antworten hervorgeht.

Stattdessen habe ich festgestellt, dass ich mit 'nsenter' auf den Container als root zugreifen kann, siehe: https://github.com/jpetazzo/nsenter

Bestimmen Sie zuerst die PID Ihres Containers auf dem Host:

docker inspect --format {{.State.Pid}} <container_name_or_ID>

Verwenden Sie dann nsenter, um den Container als root einzugeben

nsenter --target <PID> --mount --uts --ipc --net --pid
Richard Corfield
quelle
1
Mit boot2docker musste ichsudo nsenter --target <PID> --mount --uts --ipc --net --pid
peater
Ja, guter Punkt. Sie benötigen im Allgemeinen Root-Berechtigungen, um Docker-Befehle auszuführen, und ich denke, nsenter ist dasselbe. Ich habe dies in meiner Antwort nicht ganz klar gemacht.
Richard Corfield
4
Seit diese Antwort geschrieben wurde, hat Docker den Befehl exec hinzugefügt, um im Grunde dasselbe wie nsenter zu tun, aber einfacher und sauberer. Nur ein Datenpunkt für diejenigen, die diese Frage jetzt über die Suche finden. Der Befehl lautet "docker exec -it <containername> <command>" (der Befehl lautet normalerweise / bin / bash, aber Sie können natürlich tun, was Sie wollen).
Kevin Keane
Docker hat auch eine spezielle Behandlung für Hosts (und resolv.conf). Sie sollten sie nicht manuell bearbeiten. Docker erstellt / etc / hosts bei jedem Start neu, um verknüpfte Container und dergleichen wiederzugeben.
Kevin Keane
18
docker exec -u 0 -it containername bash
user128364
quelle
9

Holen Sie sich eine Shell Ihres laufenden Containers und ändern Sie das Root-Passwort:

docker exec -it <MyContainer> bash

root@MyContainer:/# passwd
Enter new UNIX password:
Retype new UNIX password:
DimiDak
quelle
9

So erstellen / ändern Sie ein Root-Passwort in einem laufenden Container

docker exec -itu root {containerName} passwd
Proximo
quelle
5

Das Passwort lautet 'ubuntu' für den Benutzer 'ubuntu' (zumindest im Docker für ubuntu: 14.04.03).

NB: 'ubuntu' wird nach dem Start des Containers erstellt. Wenn Sie dies nur tun:

 docker run -i -t --entrypoint /bin/bash  ubuntu     

Sie erhalten die Root-Eingabeaufforderung direkt. Von dort aus können Sie die Kennwortänderung von root erzwingen, den Container festschreiben und optional (mit -f) auf ubuntu markieren: spätestens so:

root@ec384466fbbb:~# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@ec384466fbbb:~# exit

% docker commit ec3844
5d3c03e7d6d861ce519fe33b184cd477b8ad03247ffe19b2a57d3f0992d71bca

docker tag -f 5d3c ubuntu:latest

Sie müssen Ihre eventuellen Abhängigkeiten von ubuntu: latest neu erstellen.

user1853859
quelle
3

Ich würde vorschlagen, dass eine bessere Lösung darin besteht --add-host NAME:IP, Docker beim Starten des Containers das Argument zu geben . Das wird das aktualisieren/etc/hosts/ Datei , ohne dass root werden muss.

Andernfalls können Sie die USEREinstellung überschreiben , indem Sie das -u USERFlag an geben docker run. Ich würde jedoch davon abraten, da Sie die Dinge in einem laufenden Container nicht wirklich ändern sollten. Nehmen Sie stattdessen Ihre Änderungen in einer Docker-Datei vor und erstellen Sie ein neues Image.

Adrian Mouat
quelle
Ich muss Einträge in der Hosts-Datei hinzufügen, während der Container ausgeführt wird.
Guillaume
Ich muss auch ein neues Paket installieren, kann es aber nicht, da ich kein Root bin.
Guillaume
1
Mit dem -uFlag können Sie den Benutzer wechseln. Ich glaube nicht, dass Sie das aus dem Container heraus tun können.
Adrian Mouat
2

Sie können den Befehl USER root in Ihrer Docker-Datei verwenden.

Naveen Kumar
quelle
2

Wenn Sie den Container starten, sind Sie root, aber Sie wissen nicht, was pw von root ist. Um es auf etwas zu setzen, das Sie kennen, verwenden Sie einfach "passwd root". Snapshot / Commit des Containers, um Ihre Aktionen zu speichern.

JohnBabrick
quelle
1

Standardmäßig werden Docker-Container als rootBenutzer ausgeführt.

Wenn Sie den Container noch verwenden, können Sie mit dem exitBefehl zurückkehrenroot Benutzer (Standardbenutzer) zurückzukehren, anstatt den Container erneut auszuführen.

Beispiel -

[dev@6c4c86bccf93 ~]$ ls
[dev@6c4c86bccf93 ~]$ other-commands..
[dev@6c4c86bccf93 ~]$ exit
[root@6c4c86bccf93 /]# ls
Mithilesh Tipkari
quelle
0

Versuchen Sie den folgenden Befehl, um den Root-Zugriff zu erhalten

$ sudo -i 
Abhishek DK
quelle
Es ist unwahrscheinlich, dass dies funktioniert, es sei denn, Sie haben das Konto im Container-Setup mit Sudo-Zugriff. Dies wäre eine ungewöhnliche Situation und würde den Punkt zerstören, dass ein Nicht-Root-Benutzer den Container ausführt.
Josiah
Kennt jemand das DEFAULT su-Passwort für die Docker-Installation? Ich habe versucht, Elevation zu laufen und es gibt einen Satz.
Patrick Burwell
Dies funktionierte in WSL2 nach dem Exportieren des Docker-Images und dem Importieren in WSL2. Von dort aus müssen Sie nur passwd ausführen, um das Kennwort für root festzulegen. Kehren Sie zum Nicht-Root-Benutzer zurück und versuchen Sie es mit sudo su oder su. Es wird jetzt funktionieren.
WSLUser
0

In einigen Fällen müssen Sie in der Lage sein, solche Dinge unter einem Benutzer mit zu tun sudo(z. B. stellt die im Container ausgeführte Anwendung Benutzern eine Shell zur Verfügung). Fügen Sie dies einfach in Ihre Docker-Datei ein:

RUN apt-get update         # If necessary
RUN apt-get install sudo   # If your base image does not contain sudo.
RUN useradd -m -N -s /bin/bash -u 1000 -p '$1$miTOHCYy$K.c4Yw.edukWJ7z9rbpTZ0' user && \
    usermod -aG sudo user  # Grant sudo to the user
USER user

Jetzt unter dem Standard - Bild Benutzer userwerden Sie der Lage sein ,sudo , mit dem Passwort - Set auf der Linie 3.

useradd Hier oder hier erfahren Sie, wie Sie einen Passwort-Hash generieren .

Greatvovan
quelle