【问题标题】:dockerize a CLI that prompts for passworddockerize 一个提示输入密码的 CLI
【发布时间】:2019-02-22 09:07:29
【问题描述】:

努力让 docker 应用同时通过管道输出到文件并读取输入。在 bash 中运行相同的命令可以正常工作。

该命令是我创建的一个名为 envwarden 的 CLI(一个简单的 bash 脚本环绕 Bitwarden CLI)。

最简单的例子:

本地

在本地运行它(不是在 docker 内部),它按预期工作:

$ ./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,事情的表现会有所不同。

使用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.

更多详情

这是Dockerfiledocker-entrypoint.sh

问题

如何让 docker 匹配与本地运行相同的行为?即提示输入密码而不显示它,并将输出重定向到标准输出。

【问题讨论】:

  • docker-entrypoint.sh 中有什么内容?
  • docker-entrypoint.sh (抱歉,忘记链接它,它都是回购的一部分。编辑我的问题以包含它)

标签: docker stdout tty


【解决方案1】:

您观察到的行为是由于docker run 处理标准流的方式。

尤其是这与moby/moby#725和PR moby/moby#741有关:

    1234563 1234563密码输入过程中的隐藏功能,以及可能的输出行重复)。
  • 如果您将-it 标志传递给docker run:分配了伪TTY,因此密码提示应该可以工作(隐藏您键入的内容),但同时,和 stderr 流是混合的,因此当您附加 >/tmp/secrets.txt 重定向时,您实际上看不到提示,因为所有内容都发送到您的 /tmp/secrets.txt 文件!

总而言之,为了实现您想要的,我想您应该坚持使用-it 选项,而是在容器“内部”(而不是外部)使用 bash 重定向,并且还依赖于一些绑定安装选项。

因此得到以下概念证明:

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"

(这应该可以正常工作,但我没有在您的特定实例上尝试过,所以欢迎使用 cmets。)

【讨论】:

  • 谢谢!我仍然对您链接到的问题以及为什么 docker 不能将输出拆分到 stdout 和 stderr 感到有些困惑,但我了解解决方法。不是很不幸,因为它不允许您使用 docker 版本作为替代品,但至少它是:)
  • @gingerlime 我认为这个问题(使用-it 时stderr 和stdout 纠缠在一起的事实)并不是Docker 特有的,因为ssh 也会出现类似的问题,例如:stderr over ssh -t。所以要么你依赖我建议的解决方法(它确实不能很好地与 bash 别名组合),或者你放弃 -t 选项并做你首先尝试过的事情,docker run --rm -i envwarden/envwarden envwarden --dotenv >/tmp/secrets.txt (然后就输了基于 TTY 的密码隐藏功能)。
  • 再次感谢埃里克。在这种情况下,我会说密码隐藏非常重要......但我很高兴至少有一个解决方法......我没有想到,但是一旦你提到它就很有意义:) .. .我以为docker在本地进程中运行,所以它应该能够拆分stderr,stdout,但显然如果它这么简单他们已经这样做了。所以我显然低估了复杂性。我想它确实阻碍了 docker 被用作打包应用程序的简单方法。
猜你喜欢
  • 2016-07-03
  • 2011-12-08
  • 2012-07-25
  • 2018-12-02
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多