Docker中-i、-t、-it启动参数区别及伪终端相关疑问
Docker run -i/-t参数常见疑问解答
1. docker run -it 与 docker run -i -t 是否完全等价?
两者完全等价。Docker的短命令参数支持布尔型参数合并写法,只要是不需要额外传值的单字母布尔参数,都可以合并到同一个-符号后,-it就是-i和-t的官方简写形式,执行逻辑和效果没有任何差异。
2. -t参数标注的「Allocate a pseudo-TTY」具体含义
pseudo-TTY中文译为伪终端,作用是让Docker为当前容器分配一个虚拟的终端设备,模拟物理终端的交互特性,会将容器进程的输入输出流绑定到这个虚拟终端上,实现和宿主机终端类似的交互效果,比如输出内容会带格式、支持终端控制指令等。
额外补充-i参数的作用:-i的作用是保持容器的标准输入流处于打开状态,支持宿主机向容器内进程传输输入内容。通常-i和-t会搭配使用,目的是启动可以直接和用户交互的容器环境,比如容器内运行shell、vim这类依赖终端的交互式程序时,就必须加-it参数才能正常使用。
3. 为什么你的所有测试命令都有输出
你测试用的镜像配置的执行命令是echo,echo本身的逻辑是直接将指定内容输出到标准输出流,不需要读取标准输入,也不依赖终端环境就能完成输出动作。
Docker默认会将容器内进程的标准输出、标准错误流直接转发到宿主机的当前终端,无论是否加-i/-t参数,这个转发逻辑都不会改变,所以哪怕你执行无参数的docker run hello-world,echo的输出内容也会正常打印到你的屏幕上,和你的预期不符是因为你选的测试程序没有体现这两个参数的作用场景。
你可以更换依赖交互的镜像做测试,比如用ubuntu镜像启动bash,就能明确看出参数差异:
docker run ubuntu bash:进程启动后立刻退出,不会进入交互环境docker run -i ubuntu bash:可以接收你输入的命令,但是输出没有终端格式,也不会出现bash提示符docker run -it ubuntu bash:正常进入交互式bash环境,有提示符,输出带终端格式,可以正常操作
内容的提问来源于stack exchange,提问作者sr-01-01
相关产品推荐
相关产品推荐

