为何仅使用-i参数时仍能获取容器进程的输出?
为什么
docker exec -i运行redis-cli仍能收到STDOUT输出? 这是因为docker exec有个默认行为:只要不使用-d(后台执行)参数,容器内进程的标准输出(STDOUT)和标准错误(STDERR)默认就会绑定到你执行命令的本地终端,和是否添加-i/-t参数无关。
拆解下相关参数的实际作用:
-i的作用仅仅是保持容器内进程的标准输入(STDIN)处于打开状态,让你能给redis-cli输入命令(比如set key 1)。-t是用来分配伪终端(PTY),目的是让交互体验更接近本地终端(比如支持命令行编辑、颜色高亮),但它不决定STDOUT是否输出到终端。
所以你执行docker exec -i abc123 redis-cli时:
-i让redis-cli能读取你输入的命令- 因为没加
-d,redis-cli的STDOUT默认直接输出到你的终端,所以你能看到"OK"的响应。
如果想验证这个逻辑,可以试试把输出重定向到空设备:
docker exec -i abc123 redis-cli > /dev/null
这时候再输入set key 1,终端就不会再显示"OK"了。
内容的提问来源于stack exchange,提问作者user22155685
相关产品推荐
相关产品推荐

