关于docker exec -i/-t选项的疑问:仅用-i为何仍有输出?
Docker中-i/-t选项的常见疑问解答
仅使用-i选项时,输入流向何处?
-i选项的核心是保持容器内进程的STDIN(标准输入)处于打开状态,不管有没有分配伪终端(TTY)。当你只加-i时,你在宿主终端输入的内容会直接传递给容器内运行的进程的STDIN。
比如执行docker exec -i mysql-container bash后,你输入ls,这个输入会被bash读取并执行——因为bash可以从STDIN读取命令,不一定需要TTY来提供交互提示符。执行结果会通过STDOUT(标准输出)转发回你的宿主终端,这是Docker默认的行为,和有没有-t无关。
为什么docker exec -i mysql-container bash时,tty返回not a tty但ls能正常输出?
tty命令的作用是检查当前进程是否关联了TTY(终端设备)。-t选项才会给容器内的进程分配伪终端(PTY),不加-t的话,进程没有绑定任何终端设备,所以tty返回not a tty是正常的。- 而
ls这类命令的输出是直接写入STDOUT,Docker在执行exec时,默认会把容器内进程的STDOUT和STDERR重定向到宿主的终端,不管有没有分配TTY。只有那些依赖TTY才能正常工作的程序(比如需要显示交互提示符、处理终端信号的程序)才会在没有-t时出现异常,ls不需要TTY,所以能正常输出结果。
内容的提问来源于stack exchange,提问作者Hwan E
相关产品推荐
相关产品推荐

