EC2 UserData执行docker-compose exec遇TTY错误,如何设为非交互模式?
问题分析与解决方法
嘿,这个问题我在自动化部署EC2实例的时候也踩过坑,咱们来好好唠唠~
为什么会出现 "the input device is not a TTY" 报错?
docker-compose exec 命令默认会尝试为容器内的进程分配一个TTY(终端设备),这是为了模拟交互式终端的体验——比如你平时在本地敲docker-compose exec web bash进入容器交互的时候,需要TTY来支持输入输出交互。
但EC2 UserData的执行环境是非交互式的:它是在实例启动时由cloud-init后台执行的,没有关联任何真实的终端设备,也就没法提供TTY。这时候docker-compose exec还硬要找TTY,自然就报错终止了。
如何强制以非交互模式运行?
解决方法很简单,给docker-compose exec加上-T参数就行,这个参数的作用就是禁用TTY分配,让命令在非交互模式下顺利执行:
docker-compose exec -T web python /var/www/flask/app/db_fixtures.py
另外补充个小提醒:如果你用的是比较旧版本的docker-compose(比如1.24之前的版本),可能需要用--no-TTY参数,但现在主流版本都是用-T就可以搞定。
还有个小细节要确认:确保你的web容器在执行这个命令时是处于运行状态的,因为exec是针对正在运行的容器执行命令的,如果容器没启动,也会报错,但这和你当前的TTY问题是两码事啦。
内容的提问来源于stack exchange,提问作者Abdennour TOUMI
相关产品推荐
相关产品推荐

