错误"输入设备不是TTY"

Ant*_*ony 329 jenkins docker jenkins-pipeline

我正在运行以下命令Jenkinsfile.但是,我收到错误"输入设备不是TTY".

docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh
Run Code Online (Sandbox Code Playgroud)

有没有办法Jenkinsfile从不进行交互模式运行脚本?

我基本上有一个名为的文件script.sh,我想在Docker容器中运行.

BMi*_*tch 503

-it从cli中删除它以使其不具有交互性并删除TTY.如果您不需要,例如在Jenkins或cron脚本中运行命令,则应该执行此操作.

或者,-i如果您输入了不是来自TTY的docker命令,则可以将其更改为.如果您有类似xyz | docker ...docker ... <input在命令行中,做到这一点.

或者,-t如果您需要TTY支持但在输入设备上没有它,则可以将其更改为.这样做是为了对日志中的输出进行颜色格式化,或者以后用适当的终端连接到容器时.

或者,如果您需要交互式终端且未在Linux或MacOS上的终端中运行,请使用其他命令行界面.据报道,PowerShell在Windows上包含此支持.


什么是TTY?它是一个终端界面,支持彩色输出,转义序列,移动光标等,这些都来自于连接到大型机的哑终端.今天它由Linux命令终端和ssh接口提供.有关详细信息,请参阅维基百科文章.

  • 我将此命令与mysql -p结合使用,而未指定密码。仅添加`-i`时,永远不会出现密码提示。仅添加`-t`会出现提示,但它似乎根本不读取输入(该输出实际上是打印出来的,而不是被提示隐藏),即使按回车也不行。只有ctrl-c可以结束它。以某种方式可以将mysql客户端与docker一起使用吗? (7认同)
  • 这次真是万分感谢!对于 docker-compose 用户,我想补充一点,我有一个类似的命令要运行 - 我想根据模式删除 redis 密钥 - 并且能够使用“docker-compose exec -T”命令来做到这一点。从“docker-compose exec”的手册页中:“禁用伪 tty 分配。默认情况下 docker-compose exec 分配一个 TTY。 (3认同)

Pio*_*yna 69

对于那些在Windows上遇到此错误和git bash的人来说,只需使用PowerShell即可-it完美运行.

  • 好.是的,它从来没有打算过.当您搜索此特定错误消息时,谷歌会弹出问题.我想,最好在某处**得到答案**而不是根本没有.显然有些人发现它很有用:) (32认同)
  • 这不回答这个问题.问题是关于Jenkins的docker,而不是Windows上的git bash. (8认同)
  • Powershell作为shell操作的TTY的问题在于它没有正确传递箭头键,如循环命令历史记录的向上箭头.除了那个缺点之外,工作得很好. (2认同)
  • 如果您想继续使用 Git Bash,请参阅 [this answer on another question](/sf/answers/3497598331/) 或 [下面的 winpty 答案](https://stackoverflow.com/a /50483923/3893015) (2认同)
  • 这对我很有帮助,所以谢谢你,我竖起了大拇指。 (2认同)

Gre*_*i64 45

如果你(像我一样)在Windows上使用git bash,你只需要放

winpty

在你的'泊坞线'之前:

winpty docker exec -it some_cassandra bash
Run Code Online (Sandbox Code Playgroud)

  • 你在问之前试过吗?我认为它附带Git(我的内部是.../Git/usr/bin) (4认同)

Gar*_*oyd 27

我相信你需要在TTY中为docker分配一个TTY(-t选项).詹金斯不是在TTY中执行其工作.

话虽如此,您在Jenkins中运行的脚本可能也想在本地运行.在这种情况下,分配TTY非常方便,因此在本地运行时可以发送ctrl+等信号c.

要解决此问题,您的脚本可以选择使用该-t选项,如下所示:

test -t 1 && USE_TTY="-t" 
docker run ${USE_TTY} ...
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。它实际上以普遍适用的方式解决了这个问题 (5认同)

yes*_*ema 20

这并不是您要问的,但是:

-T键将有助于谁使用人泊坞窗,撰写EXEC!

docker-compose -f /srv/backend_bigdata/local.yml exec -T postgres backup
Run Code Online (Sandbox Code Playgroud)

  • 正是我所需要的。根据帮助: -T 禁用伪tty分配。默认情况下,“docker-compose exec”分配一个 TTY。 (15认同)
  • 我希望我能再次投票赞成这个答案...... (3认同)

小智 9

同样的情况在这里,我运行以下命令 throw .sh script(bash) 和 python .py 但是,我收到相同的错误“输入设备不是 TTY ”。

就我而言,我尝试从“生产”环境的正在运行的容器中获取转储,并进行身份验证并传递一些参数,然后获取mssql 数据库容器.bak文件的输出。

从命令中删除-it 。如果你想保持交互,请保留-i

你可以检查我的 .sh 文件和一个长命令转储。 在此输入图像描述


wan*_*sir 6

当使用'git bash'时,

1)我执行命令:

docker exec -it 726fe4999627 /bin/bash
Run Code Online (Sandbox Code Playgroud)

我有错误:

the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'
Run Code Online (Sandbox Code Playgroud)

2)然后,我执行命令:

winpty docker exec -it 726fe4999627 /bin/bash
Run Code Online (Sandbox Code Playgroud)

我还有另一个错误:

OCI runtime exec failed: exec failed: container_linux.go:344: starting container process caused "exec: \"D:/Git/usr/bin/
bash.exe\": stat D:/Git/usr/bin/bash.exe: no such file or directory": unknown
Run Code Online (Sandbox Code Playgroud)

3)第三,我执行:

winpty docker exec -it 726fe4999627 bash
Run Code Online (Sandbox Code Playgroud)

有效。

当我使用“ powershell”时,一切运行良好。


Sai*_*Sai 6

使用 docker-compose exec -T 通过 Jenkins 为我解决了这个问题

docker-compose exec -T containerName php script.php