“docker exec”命令的“-i”和“-t”选项的用途是什么?

时间:2016-02-22 10:02:18

标签: linux docker tty

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

  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
    

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

  4. 所以似乎没有必要使用docker exec -i …docker exec -t …命令。任何人都可以详细说明-i命令存在-tdocker exec选项的原因吗?

1 个答案:

答案 0 :(得分:12)

-i--interactive即使没有附加也会保持STDIN打开,如果你想输入任何命令,你需要它。

-t--tty分配一个伪TTY,一个pseudo terminal,用于连接用户"终端"与stdin和stdout。 (见container/container.go

如果您进行回音,则只需要-t 但是对于输入输入的交互式会话,您需要-i

由于-i保持stdin打开,因此它也用于将输入传递给分离的docker容器。即使使用-d(分离),这也会有效 请参阅" When would I use --interactive without --tty in a Docker container?":

$ echo hello | docker run -i busybox cat
  hello
  

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

对于docker exec,由docker run设置的那个。

但是,关于docker exec,目前存在问题(issue 8755: Docker tty is not a tty with docker exec

  

不幸的是,您的发现仅相当于centos6与ubuntu中的tty行为之间的差异:14.04。 exec内部仍然没有功能性tty - 只需执行ls -la /proc/self/fd/0并看到它指向一个不存在的pts的断开链接。

     

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

     

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

注意(2017年第4季度):this should been fixed by now (docker 17.06-ce) 请参阅PR 33007

PR现在允许(自17.06开始):

zacharys-pro:dev razic$ docker run --rm -t -d ubuntu bash
83c292c8e2d13d1b1a8b34680f3fb95c2b2b3fef71d4ce2b6e12c954ae50965a

zacharys-pro:dev razic$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
83c292c8e2d1        ubuntu              "bash"              2 seconds ago       Up 1 second                             xenodochial_bardeen

zacharys-pro:dev razic$ docker exec -ti xenodochial_bardeen tty
/dev/pts/1

(17.06之前,tty正在返回" not a tty")