Dockerize CLI, который запрашивает пароль - PullRequest
0 голосов
/ 22 февраля 2019

Изо всех сил пытается получить приложение докера и направить вывод в файл, и прочитать ввод.Выполнение той же команды в bash работает нормально.

Команда представляет собой созданный мной CLI, который называется envwarden (простой сценарий bash, обертывающий * CLI Bitwarden ).

Проще всего показать пример:

локально

Запуск его локально (не внутри докера), он работает как положено:

$ ./envwarden --dotenv >/tmp/secrets.txt
.envwarden file not found in /home/user ... prompting for credentials
? Email address: my@email.addr
? Master password: [hidden]

Подсказки работают нормально,Я могу ввести свой адрес электронной почты (показан), пароль (скрытый), и вывод будет /tmp/secrets.txt очень хорошо.

с докером

С докером все ведет себя немного по-другому.

С docker run -ti (или просто docker run -t) вообще нет запроса на электронную почту или пароль ...

$ docker run --rm -ti envwarden/envwarden envwarden --dotenv >/tmp/secrets.txt

# ... no output ... 

С docker run -i приглашение отображается, но все, что угодноЯ набираю текст, пароль также отображается!: - /

$ docker run --rm -i envwarden/envwarden envwarden --dotenv >/tmp/secrets.txt
.envwarden file not found in /root ... prompting for credentials
? Email address: my@email.address
? Email address: my@email.address
? Master password: [input is hidden] my password
? Master password: [hidden]

docker run, без -t или -i показывает приглашение, но не получает ввод

$ docker run --rm envwarden/envwarden envwarden --dotenv >/tmp/secrets.txt
.envwarden file not found in /root ... prompting for credentials
? Email address: unable to login or sync with bitwarden.

Более подробная информация

Вот Dockerfile и docker-entrypoint.sh

Вопрос

Как заставить докер соответствовать тому же поведению, что и локальный запуск?т.е. запрашивать пароль, не показывая его, и перенаправлять вывод на стандартный вывод.

1 Ответ

0 голосов
/ 23 февраля 2019

Наблюдаемое вами поведение обусловлено тем, как docker run обрабатывает стандартные потоки.

В частности, это относится к moby / moby # 725 и PR moby /moby # 741 :

  • Если вы передадите флаг -i или -t не docker run: ваш терминал не подключен к стандартному входу вашей основной программы,который ведет себя так, как если бы вы вводили пустые строки в качестве учетных данных.

  • Если вы только передаете флаг -i на docker run, ваш терминал подключен к стандартному вводу вашей программы, но нетвыделяется псевдо-TTY, что подразумевает, что вы получаете не очень удобное для пользователя взаимодействие с CLI (без возможности скрытия при вводе пароля и возможного дублирования строк вывода).

  • Если вы передадите -it указывает на docker run: выделен псевдо-TTY, поэтому запрос на ввод пароля должен работать (скрывая то, что вы вводите), но в то же время потоки stdout и stderr смешиваются , поэтому, когдавы добавляете перенаправление >/tmp/secrets.txt, на самом деле вы не видитеompt, поскольку все отправлено в ваш файл /tmp/secrets.txt!

В общем, для достижения того, что вы хотите, я думаю, вам следует придерживаться опции -it, а лучше использовать bashперенаправление «внутри» контейнера (не снаружи), а также полагаться на какую-либо опцию bind-mount.

Отсюда и следующее доказательство концепции:

export out="/tmp/secrets.txt"  # absolute path to the output file in the host
docker run --rm -it -v "$out:$out" envwarden/envwarden \
  /bin/bash -c "envwarden --dotenv >$out"
cat "$out"

(Это должно работать нормально, но яне пробовал на вашем конкретном экземпляре, поэтому комментарии приветствуются.)

...