Node.js调用exec执行Docker命令报错the input device is not a TTY问题求助
问题原因
- 你执行的
docker run命令添加了--tty(简写-t)和--interactive(简写-i)参数:--tty的作用是为容器分配一个伪终端(TTY),依赖执行环境提供可用的TTY资源;--interactive需要保持标准输入流打开用于交互。 - Node.js的
child_process.exec接口(包含child-process-promise库封装的exec方法)默认执行命令时,不会为子进程继承或分配TTY,docker检测不到可用的TTY设备就会抛出对应报错。
解决方案
根据你的使用场景选择对应方案即可:
方案1:无需交互场景移除TTY相关参数
如果你的docker容器不需要人工输入交互,直接删除命令中的--tty、--interactive参数即可解决报错:
import Process from 'child-process-promise'; const test = async () => { // 移除-t、-i相关参数 await Process.exec('docker run --rm ...'); }; test();
方案2:需要交互场景调整执行方式
如果确实需要用户和容器进行交互操作,改用spawn方法执行命令,同时配置标准流继承当前终端:
import Process from 'child-process-promise'; const test = async () => { // spawn方法配置stdio继承父进程的终端资源,透传TTY能力 await Process.spawn('docker', ['run', '--rm', '--tty', '--interactive', /* 剩余命令参数 */], { stdio: 'inherit' }); }; test();
说明:exec默认是缓冲输出模式,适合直接获取命令执行的完整结果,不支持交互场景;spawn是流式输出模式,配置stdio: 'inherit'后会把当前终端的输入、输出、TTY资源全部透传给docker子进程,满足TTY分配要求。
内容的提问来源于stack exchange,提问作者mdmb
相关产品推荐
相关产品推荐

