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

Nan*_*iao 8 linux tty docker

说实话,我一直困惑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
    
    Run Code Online (Sandbox Code Playgroud)

    它正常工作.

  2. docker exec -i …:

    # docker exec -i 115c89122e72 bash
    ^C
    
    Run Code Online (Sandbox Code Playgroud)

    命令挂起,我必须使用Ctl+ c来中断它.

  3. docker exec -t …:

    # docker exec -t 115c89122e72 bash
    root@115c89122e72:/# ls
    ^C
    
    Run Code Online (Sandbox Code Playgroud)

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

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

Von*_*onC 12

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

-t,--tty分配一个伪TTY,一个将用户的"终端"与stdin和stdout连接起来的伪终端.(见container/container.go)

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

由于-i保持stdin打开,它还用于将输入管道输送到分离的docker容器.这甚至可以用-d(分离).
请参阅" 何时在Docker容器中--interactive不使用--tty? ":

$ echo hello | docker run -i busybox cat
  hello
Run Code Online (Sandbox Code Playgroud)

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

它是,因为docker exec,由一组docker run.

但是,关于docker exec,有一个当前的问题(问题8755:Docker tty不是一个ttydocker exec

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

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

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

注(2017年第4季度):现在应该已经修好了(码头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
Run Code Online (Sandbox Code Playgroud)

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