docker exec -it 返回“无法在非 tty 输入上启用 tty 模式”

Posted

技术标签:

【中文标题】docker exec -it 返回“无法在非 tty 输入上启用 tty 模式”【英文标题】:docker exec -it returns "cannot enable tty mode on non tty input" 【发布时间】:2015-06-05 11:36:02 【问题描述】:

docker exec -it 命令返回以下错误“无法在非 tty 输入上启用 tty 模式”

level="fatal" msg="cannot enable tty mode on non tty input" 

我在 centos box 6.6 上运行 docker(1.4.1)。 我正在尝试执行以下命令 docker exec -it containerName /bin/bash 但我收到以下错误

level="fatal" msg="cannot enable tty mode on non tty input" 

【问题讨论】:

containername 是否与终端 (-t) 一起运行? docker exec -i 是否比 docker exec -it 效果更好? @Andy - 没听懂我正在尝试使用以下命令运行容器:docker exec -it ContainerName /bin/bash @user2915097 是的! -i 效果更好:) 【参考方案1】:

运行 docker exec -i 而不是 docker exec -it 解决了我的问题。事实上,我的脚本是由 CRONTAB 启动的,它不是终端。

提醒一下:

Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

  -i, --interactive=false    Keep STDIN open even if not attached  
  -t, --tty=false            Allocate a pseudo-TTY

【讨论】:

使用 -i 或 -t(或 -it)我仍然遇到问题。 docker exec tty 错误:github.com/docker/docker/issues/8755 解决方法建议使用 docker exec -it CONTAINER script -qc 命令。我在 jenkins 作业下运行 docker exec -it 并收到错误“无法在非 tty 输入上启用 tty 模式”。 其实我发现我的问题可以追溯到jenkins shell下的ssh是怎么做的。使用 ssh -T 标志(禁用伪 tty 生成)帮助解决了我的问题。【参考方案2】:

如果您在 windows docker 客户端 中遇到此错误,那么您可能需要使用以下运行命令

$ winpty docker run -it ubuntu /bin/bash

【讨论】:

O/p 在 centos 6.6 上使用 docker。虽然这个答案可能会解决 Windows 上的类似问题,但它不能在 linux 上解决,尤其是 centos 6.6 @jonashdown,这个解决方案是专门针对windows docker客户端的,内容里有明确说明。 这个命令将运行一个新的图像实例。【参考方案3】:

只需使用“-i”

docker exec -i [your-ps] [命令]

【讨论】:

【参考方案4】:

如果您在 Windows 上使用 docker-machine 并且使用 GIT Bash 或 Cygwin,要“进入”正在运行的容器,您需要执行以下操作:

docker-machine ssh default ssh 进入虚拟机(最有可能是虚拟机)

docker exec -it <container> bash 进入容器。

编辑:

我最近发现,如果您使用 Windows PowerShell,您可以 docker exec 直接进入容器,使用 Cygwin 或 Git Bash 您可以使用 winpty docker exec -it <container> bash 并跳过上面的 docker-machine ssh 步骤。

【讨论】:

这个答案可能会解决 windows 用户的问题,但不能解决 centos 6.6 上的 o/p 问题【参考方案5】:

在使用 boot2docker 的 Windows 上执行以下命令时,我得到“无法在非 tty 输入上启用 tty 模式”

docker exec -it <containerIdOrName> bash

下面的命令修复了问题

winpty docker exec -it <containerIdOrName> bash

【讨论】:

【参考方案6】:

docker exec 运行一个新命令in an already-running container。这不是启动新容器的方法——使用docker run

这可能是“非 tty 输入”错误的原因。或者它可能是你运行 docker 的地方。它是一个真正的终端吗?也就是说,是否有完整的 tty 会话可用?您可能想检查您是否正在与

进行交互会话
[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'

来自https://unix.stackexchange.com/questions/26676/how-to-check-if-a-shell-is-login-interactive-batch

【讨论】:

正确。我从持续集成工具运行这个命令作为(shell命令)。但是,当我直接在同一台机器的终端窗口上运行相同的命令时,一切正常。当我运行 [[ $- == i ]] && echo 'Interactive' ||在终端上回显“非交互式”命令我得到了交互式响应,但是当我从 CI 工具在同一台机器上运行相同的命令时,我得到了非交互式响应。我该如何解决?这是一个 centos 6.6 盒子。 关于“运行”和“执行”,我的容器已经在运行。因此,当我执行 docker ps -a 时,我看到我的容器正在运行,但是当我尝试在现有容器中运行命令时,出现上述错误。感谢您的所有帮助! 嘿user2118095,你能找到任何解决方案吗,我也一样。 @user2118095 你有解决方案吗?如果你能解决这个问题,如果你能分享解决方案,那就太好了。【参考方案7】:

我在 Windows 7 64 位中使用 Git for Windows 附带的 Mintty 遇到了同样的错误消息。 $docker run -i -t ubuntu /bin/bash cannot enable tty mode on non tty input

我尝试在上面的命令前面加上 winpty 作为其他答案的建议,但运行它会显示下面的另一条错误消息: $ winpty docker run -i -t ubuntu /bin/bash exec: "D:\\Git\\usr\\bin\\bash": executable file not found in $PATH docker: Error response from daemon: Container command not found or does not exist..

然后我碰巧运行了以下命令,它给了我想要的东西: $ winpty docker run -i -t ubuntu bash root@512997713d49:/# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr root@512997713d49:/#

【讨论】:

【参考方案8】:

我在 jenkins 作业下运行 docker exec -it 并收到错误“无法在非 tty 输入上启用 tty 模式”。没有返回到 docker exec 命令的输出。我的工作登录顺序是:

jenkins shell -> ssh user@<testdriver> -> ssh root@<sut> -> su - <user> -> docker exec -it <container>

我做了一个改变,在 jenkins 的初始 ssh 中使用 -T 标志。 “-T - 禁用伪终端分配”。并将 -i 标志与 docker exec 一起使用,而不是 -it。 “-i - 交互式。-t - 分配伪 tty。”。这似乎解决了我的问题。

jenkins shell -> ssh -T user@<testdriver> -> ssh root@<sut> -> su - <user> -> docker exec -i <container>

行为类型匹配此 docker exec tty 错误:https://github.com/docker/docker/issues/8755。该 docker bug 讨论的解决方法建议使用以下方法:

docker exec -it <CONTAINER> script -qc <COMMAND>

使用该解决方法并没有解决我的问题。不过这很有趣。使用不同的标志和不同的 ssh 调用尝试这些,即使将 -t 与 docker exec 一起使用,您也可以看到“不是 tty”:

$ docker exec -it <CONTAINER> script -qc 'tty'
/dev/pts/0
$ docker exec -it <CONTAINER> 'tty'            
not a tty
$ docker exec -it <CONTAINER> bash -c 'tty' 
not a tty

【讨论】:

以上是关于docker exec -it 返回“无法在非 tty 输入上启用 tty 模式”的主要内容,如果未能解决你的问题,请参考以下文章

Docker(17)- docker exec 命令详解

docker cp 和docker exec 查看docker 运行的容器信息

19-Docker-常用命令详解-docker exec

docker run 和 docker exec 的差异

如何在每个“exec”命令中执行 Docker 映像的入口点?

text DOCKER_EXEC