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 cp 和docker exec 查看docker 运行的容器信息