错误“输入设备不是 TTY”

新手上路,请多包涵

我正在从我的 Jenkinsfile 运行以下命令。但是,我收到错误 “输入设备不是 TTY”

 docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh

有没有办法在不使用交互模式的情况下从 Jenkinsfile 运行脚本?

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

原文由 Anthony 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 887
2 个回答

从您的 cli 中删除 -it 以使其非交互并删除 TTY。如果您不需要,例如在 Jenkins 或 cron 脚本中运行您的命令,您应该这样做。

或者您可以将其更改为 -i 如果您通过管道输入不是来自 TTY 的 docker 命令。如果您的命令行中有 xyz | docker ...docker ... <input 类的内容,请执行此操作。

或者您可以将其更改为 -t 如果您想要 TTY 支持但输入设备上没有它。对检查 TTY 以启用日志中输出颜色格式的应用程序执行此操作,或者当您稍后使用适当的终端附加到容器时执行此操作。

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


什么是 TTY?它是一个支持转义序列、移动光标等的终端界面,它来自于连接到大型机的愚蠢终端的旧时代。今天它由 Linux 命令终端和 ssh 接口提供。有关 更多详细信息,请参阅维基百科文章

要查看使用和不使用 TTY 运行容器的区别,请运行没有 TTY 的容器: docker run --rm -i ubuntu bash 。从该容器内部,使用 apt-get update; apt-get install vim 安装 vim。请注意缺少提示。对文件运行 vim 时,尝试在文件中移动光标。

原文由 BMitch 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于 docker run 不要使用 -it 标志

(如BMitch所说)

这并不完全是您所要求的,但对其他人也有用:

对于 docker-compose exec 使用 -T 标志!

-T 键 可以帮助使用 docker-compose exec 的人! (它禁用伪 tty 分配)

例如:

 docker-compose -f /srv/backend_bigdata/local.yml exec -T postgres backup

或者

docker-compose exec -T mysql mysql -uuser_name -ppassword database_name < dir/to/db_backup.sql

原文由 yestema 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进