为什么在“docker exec”命令中存在“-i”和“-t”选项?

说实话,我一直对docker exec -it …docker exec -i …docker exec -i …以及docker exec -t …感到困惑,所以我决定做一个testing:

  1. docker exec -it …

     # docker exec -it 115c89122e72 bash root@115c89122e72:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var 

    它工作正常。

  2. docker exec -i …

     # docker exec -i 115c89122e72 bash ^C 

    该命令挂起,我不得不用Ctl + C中断它。

  3. docker exec -t …

     # docker exec -t 115c89122e72 bash root@115c89122e72:/# ls ^C 

    它成功进入容器,但挂在执行第一个命令。

所以看起来没有任何一个docker exec -i …docker exec -t …命令的意义。 任何人都可以详细说明为什么docker exec命令存在-i-t选项?

Solutions Collecting From Web of "为什么在“docker exec”命令中存在“-i”和“-t”选项?"

-i , – --interactive即使没有连接也会保持STDIN打开状态,如果你想输入任何命令的话,你需要这个。

-t ,– --tty分配一个伪TTY,一个连接用户的“终端”与标准输入和标准输出的伪终端 。 (请参阅container/container.go

如果你做回声,只需要-t
但是对于输入输入的交互式会话,您需要-i

由于-i使stdin保持打开状态,因此它也用于将输入管道输入到分离的泊坞窗容器。 即使使用-d (分离),这也可以工作。
请参阅“ 何时在Docker容器中使用--interactive而不使用--tty ? ”:

 $ echo hello | docker run -i busybox cat hello 

-i保持STDIN打开,即使没有连接,在这种情况下STDOUT的状态是什么?

docker exec ,就是docker run设定的docker run

但是,关于docker exec ,目前还有一个问题( 问题8755:码头管理员不是tty的Docker管理员

不幸的是,你的发现只能说明centos6与ubuntu的tty行为之间的差别:14.04。 在exec里面还没有一个功能性的tty – 只要做ls -la /proc/self/fd/0看到这是一个指向不存在的pts的断开链接。

我们正在处理的实际错误是某些标准库假定/ proc / self / fds /中的符号链接必须是有效的符号链接

问题是,tty是在主机外部创建的,并没有像在主容器中设置/dev/console那样在容器中引用它。
解决这个问题的一个选择是分配并绑定主机中的设备到容器中。

注意(2017年第四季度): 现在应该确定(码头17.06-ce)