SSH与Docker:解决‘input device is not a TTY’错误并查看远程docker-compose exec命令输出的方法
解决SSH远程执行docker-compose exec时的"input device is not a TTY"错误
这个问题我之前在自动化部署脚本里碰到过,核心原因很明确:docker-compose exec默认会尝试给容器内的进程分配一个TTY终端,但你用SSH heredoc这种非交互式批量执行的方式时,远程会话并没有可用的TTY设备,所以就会抛出这个报错。
要解决这个问题并正常查看命令输出,只需要一个简单的调整:
解决方案:给docker-compose exec添加-T参数
-T参数的作用是告诉Docker不要为容器内的命令分配伪终端(TTY),完美适配非交互式的SSH执行场景。修改后的完整命令如下:
ssh user@xx.xx.xx.xx <<'ENDSSH' set -x -o verbose; cd /home/user/project ls -al # 添加-T参数禁用TTY分配,解决报错 docker-compose exec -T webapp sh -c '. /home/user/app/venv/bin/activate && cd src/ && python manage.py makemigrations' docker-compose exec -T webapp sh -c '. /home/user/app/venv/bin/activate && cd src/ && python manage.py migrate' set +x ENDSSH
效果说明
- 加上
-T后,"input device is not a TTY"的报错会直接消失,两条Django迁移命令会正常执行。 - 命令的所有输出(比如
makemigrations提示"no changes detected",或者migrate的执行日志)都会通过SSH会话实时返回,显示在你的本地终端里。 - 你保留的
set -x调试开关也会正常输出每一步的执行细节,方便排查后续可能的问题。
额外提一句:如果之后需要交互式进入容器(比如执行docker-compose exec webapp bash),那还是需要TTY,这时候可以用-t参数,但在批量执行命令的场景下,-T才是正确的选择。
内容的提问来源于stack exchange,提问作者Santhosh
相关产品推荐
相关产品推荐

