Wie kann ich das Root-Passwort in einem Docker-Container über ein Skript festlegen?

10

Ich habe ein Skript, das auf dem Host ausgeführt wird und einen Docker-Container erstellt / startet / stoppt. Ich möchte, dass das Skript das Kennwort des Root-Benutzers im Container ändert.

Da der Container ein SSH-Server ist, habe ich versucht: sshpass -p 'OLDPASS' ssh root@<container-IP> 'echo -e "NEWPASS\nNEWPASS" | passwd root'

aber es funktioniert nicht. Bevor ich fortfahre und mehr Zeit mit dem Debuggen verbringe, möchte ich wissen, ob es einen intelligenteren Weg gibt, dies zu tun.

Ich verstehe, dass der richtige "Docker-Weg" darin besteht, ein Skript zu erstellen, das von der Docker-Datei ausgeführt wird, das das Kennwort von einem freigegebenen Volume abruft und es als Root-Kennwort festlegt. Das klingt kompliziert, aber ich weiß, wie es geht und funktioniert gut für ein anderes Docker-Image, das ich verwende. Aber ich möchte es nicht für diesen tun.

Ich brauche nur einen Befehl, der Docker oder ssh verwendet, um das Passwort eines Benutzers nicht interaktiv zu ändern.

Chris
quelle

Antworten:

7
PASSWORD=$(zenity --password --title="Docker" 2>/dev/null)

öffnet ein Popup, fragt nach dem Passwort und gibt es zurück. Im Skript ist kein Passwort gespeichert

Wenn Sie einen Docker-Container haben, in dem Sie ein Kennwort festlegen müssen, ohne sich um die Sicherheit zu kümmern, können Sie der Docker-Datei eine Anweisung hinzufügen:

RUN echo "root:root" | chpasswd
Ulf Samuelsson
quelle
Ich habe die gleiche Möglichkeit, die Methode wie Ihre in zwei meiner Docker-Dateien festzulegen (anderes Projekt, aber in den wesentlichen Teilen gleich). Aber einer arbeitet (ich kann es tun), der andere erlaubt es mir nicht. Irgendeine Idee warum?
ismailsunni
2
+1 Antwort wäre transparenter, wenn es stdin für chpasswd erklärt:echo username:newpassword | chpasswd
Jonathan Komar
5

Dies hat nichts mit Docker zu tun. Sie müssen ausdrücklich angeben, passwddass Sie das Kennwort von angeben möchten stdin.

echo 'newpassword' |passwd root --stdin
user1700494
quelle
Danke für die Eingabe. --stdin wird auf Ubuntu jedoch nicht unterstützt. Es funktioniert nicht.
Chris
14
--stdinwurde auf neueren Linux-Systemen abgeschrieben. Verwenden Sie chpasswdstattdessen:echo username:newpassword | chpasswd
Unblevable
1

Dies funktioniert einwandfrei unter Ubuntu 14.04.4 LTS:

Fügen Sie in dem Skript, das den Container neu erstellt (der auf dem "Host" ausgeführt werden soll), die folgenden Zeilen hinzu:

$PASS='<a-good-password>'
echo -e "$PASS\n$PASS" | sudo docker exec -i <container-id-or-name> passwd
Chris
quelle
Das Einfügen des tatsächlichen Kennworts in ein Skript ist eine sehr unsichere Methode zum Umgang mit Kennwörtern. Es wäre viel sicherer, ein ordnungsgemäß gehashtes Passwort in das Skript einzufügen und es zu verwenden, usermodals es zu verwenden passwd.
Kasperd
Guter Punkt, danke. In diesem Fall bin ich mit dem Risiko einverstanden, da dies nur ein Docker-Container ist, der nur sehr wenige Dinge tut. Wenn jemand das Skript lesen kann, besitzt er bereits den Rest des Servers. Ich werde es aber für das nächste Mal im Hinterkopf behalten :).
Chris