CentOS 8/Windows下Python调用Docker报错the input device is not a TTY如何解决
报错成因
-ti是docker run的常用参数,其中-t(--tty)的作用是为容器分配伪终端(TTY)设备,该参数要求执行docker命令的进程必须持有TTY输入输出上下文。
你通过subprocess.Popen调用docker时,为stdin、stdout指定了subprocess.PIPE类型,这是普通的进程间通信管道,不属于TTY设备,无法满足-t参数的运行要求,因此会跨环境触发该报错。
解决方案
根据你的使用场景选择对应方案即可:
- 非交互式场景(仅需要向容器传输入、读取输出,即你当前使用
communicate传递数据的场景):直接删除docker run命令中的-t参数,可保留-i(--interactive)保证标准输入可写入,修改后的代码如下:
container = subprocess.Popen(["docker", "run","-i", "--rm", "--name",imageName,imageName],stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) c= container.communicate(input='some data'.encode())[0]
- 必须使用TTY的交互式场景:需要额外创建伪终端绑定到subprocess的输入输出,不能直接用
subprocess.PIPE。Linux环境可通过Python内置pty模块实现,示例如下:
import pty import os import subprocess # 新建伪终端对 master_fd, slave_fd = pty.openpty() container = subprocess.Popen(["docker", "run","-ti", "--rm", "--name",imageName,imageName], stdin=slave_fd, stdout=slave_fd, stderr=subprocess.STDOUT) os.close(slave_fd) # 写入输入 os.write(master_fd, b'some data\n') # 读取输出 output = os.read(master_fd, 4096)
Windows环境下伪终端实现逻辑不同,Python 3.10+可配合creationflags=subprocess.CREATE_NEW_CONSOLE参数使用,也可引入第三方winpty库完成适配,非必要场景优先选择第一种方案即可。
内容的提问来源于stack exchange,提问作者xineta5158
相关产品推荐
相关产品推荐

