Как я могу установить пароль root в контейнере Docker из скрипта?

11

У меня есть скрипт, который работает на хосте и создает / запускает / останавливает контейнер докера. Я бы хотел, чтобы скрипт изменил пароль пользователя root в контейнере.

Поскольку контейнер является сервером ssh, я попытался: sshpass -p 'OLDPASS' ssh root@<container-IP> 'echo -e "NEWPASS\nNEWPASS" | passwd root'

но это не работает Прежде чем идти дальше и тратить больше времени на его отладку, я хотел бы знать, есть ли более разумный способ сделать это.

Я понимаю, что правильный «путь докера» - создать скрипт, запускаемый Dockerfile, который извлекает пароль из общего тома и устанавливает его в качестве пароля root. Это звучит сложно, но я знаю, как это сделать, и хорошо работает для другого образа докера, который я использую. Но я не хочу делать это для этого.

Мне просто нужна команда, которая использует Docker или ssh для неинтерактивного изменения пароля пользователя.

Крис
источник

Ответы:

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

откроет всплывающее окно с запросом пароля и вернет его. В скрипте не хранится пароль

Если у вас есть докер-контейнер, в котором вам нужно установить пароль, не заботясь о безопасности, вы можете добавить в Dockerfile инструкцию:

RUN echo "root:root" | chpasswd
Ульф Самуэльссон
источник
У меня есть такой же способ установить метод, как у вас, в двух из моего Dockerfile (другой проект, но в основных частях один и тот же). Но один работает (я могу ssh к нему), другой не позволяет мне. Есть идеи почему?
Исмаилсунни
3
+1 Ответ был бы более прозрачным, если бы он объяснил stdin для chpasswd:echo username:newpassword | chpasswd
Джонатан Комар
5

Это не связано с Docker. Вы должны четко указать, passwdчто вы собираетесь предоставить пароль от stdin.

echo 'newpassword' |passwd root --stdin
user1700494
источник
Спасибо за вклад. --stdin не поддерживается в Ubuntu. Не работает
Крис
14
--stdinустарела в новых системах Linux. Используйте chpasswdвместо этого:echo username:newpassword | chpasswd
unblevable
1

Это работает безупречно на Ubuntu 14.04.4 LTS:

В сценарии, который перестраивает контейнер (который должен работать на «хосте»), добавьте следующие строки:

$PASS='<a-good-password>'
echo -e "$PASS\n$PASS" | sudo docker exec -i <container-id-or-name> passwd
Крис
источник
Ввод действительного пароля в сценарий является очень небезопасным способом обработки паролей. Было бы намного безопаснее поместить правильно хешированный пароль в скрипт и использовать usermodвместо него passwd.
Касперд
Хороший вопрос, спасибо. В этом случае я согласен с риском, так как это всего лишь док-контейнер, который делает очень мало вещей. Если кто-то может прочитать сценарий, он уже владеет остальной частью сервера. Я буду помнить это в следующий раз, хотя :).
Крис