Comment puis-je définir le mot de passe root dans un conteneur Docker à partir d'un script?

11

J'ai un script qui s'exécute sur l'hôte et crée / démarre / arrête un conteneur Docker. J'aimerais que le script change le mot de passe de l'utilisateur root dans le conteneur.

Puisque le conteneur est un serveur ssh, j'ai essayé: sshpass -p 'OLDPASS' ssh root@<container-IP> 'echo -e "NEWPASS\nNEWPASS" | passwd root'

mais ça ne marche pas. Avant d'aller plus loin et de passer plus de temps à le déboguer, j'aimerais savoir s'il existe une façon plus intelligente de le faire.

Je comprends que la bonne "manière de docker" consiste à créer un script exécuté par le Dockerfile, qui extrait le mot de passe d'un volume partagé et le définit comme mot de passe root. Cela semble compliqué, mais je sais comment le faire et fonctionne bien pour une autre image de docker que j'utilise. Mais je ne veux pas le faire pour celui-ci.

J'ai juste besoin d'une commande qui utilise Docker ou ssh pour modifier le mot de passe d'un utilisateur de manière non interactive.

Chris
la source

Réponses:

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

ouvrira une fenêtre contextuelle, demandant un mot de passe, et le retournera. Aucun mot de passe stocké dans le script

Si vous avez un conteneur Docker où vous devez définir un mot de passe, sans trop vous soucier de la sécurité, vous pouvez ajouter une instruction dans le Dockerfile:

RUN echo "root:root" | chpasswd
Ulf Samuelsson
la source
J'ai la même façon de définir la méthode comme la vôtre dans deux de mes Dockerfile (projet différent, mais même dans les parties essentielles). Mais l'un fonctionne (je peux y penser) l'autre ne me le permet pas. Une idée pourquoi?
ismailsunni
3
+1 La réponse serait plus transparente si elle expliquait stdin pour chpasswd:echo username:newpassword | chpasswd
Jonathan Komar
5

Ce n'est pas lié à Docker. Vous devez explicitement dire passwdque vous allez fournir un mot de passe stdin.

echo 'newpassword' |passwd root --stdin
user1700494
la source
Merci pour la contribution. --stdin n'est cependant pas pris en charge sur ubuntu. Ça ne marche pas.
Chris
14
--stdina été déprécié sur les nouveaux systèmes Linux. Utilisez à la chpasswdplace:echo username:newpassword | chpasswd
unblevable
1

Cela fonctionne parfaitement sur Ubuntu 14.04.4 LTS:

Dans le script qui reconstruit le conteneur (qui devrait être exécuté sur "l'hôte"), ajoutez ces lignes:

$PASS='<a-good-password>'
echo -e "$PASS\n$PASS" | sudo docker exec -i <container-id-or-name> passwd
Chris
la source
Mettre le mot de passe réel dans un script est un moyen très peu sûr de gérer les mots de passe. Il serait beaucoup plus sûr de mettre un mot de passe correctement haché dans le script et de l'utiliser usermodplutôt que passwd.
kasperd
Bon point, merci. Dans ce cas, je suis d'accord avec le risque, car ce n'est qu'un conteneur docker qui fait très peu de choses. Si quelqu'un peut lire le script, il possède déjà le reste du serveur. Je garderai cela à l'esprit pour la prochaine fois :).
Chris