在Docker中,-i标志是什么作用?

23

我刚刚在阅读Docker的这篇文章,它是一篇描述如何将简单应用程序docker化的文章。执行了以下命令:

$ docker run -t -i ubuntu:14.04 /bin/bash, 

然后,接下来给出以下解释:
在这里,我们再次指定了docker run命令并启动了一个ubuntu:14.04镜像。但是,我们还传递了两个标志:-t和-i。-t标志为我们的新容器分配了一个伪终端或终端,并且-i标志允许我们通过获取容器的标准输入(STDIN)来建立交互式连接。
我不理解的意思是:
-i flag allows us to make an interactive connection by grabbing the standard in (STDIN)

谢谢。

交互式? - Coastal-Cam
3个回答

30

Docker 的 -i/--interactive 命令允许您通过标准输入 ("STDIN") 向容器发送命令,这意味着您可以通过 -t 开关创建的伪终端/终端 "交互式" 输入命令。


3
交互式和非交互式有什么区别? - Tenali_raman
2
非交互式意味着您无法使用“-t”分配的tty传递文本。交互式意味着您可以输入命令,容器中的tty将接收此文本。 - user559633
6
我仍然感到困惑。根据文档,"-i"的意思是“即使未连接,也要保持标准输入处于打开状态”。这使我觉得当标准输入被连接时,“-i”应该是不必要的,只有在使用“-d”选项或明确不包括标准输入的“-a”时才需要。然而,这显然是错误的,因为如果我运行“docker run -t ubuntu cat”,它不会回显输入;我必须添加“-i”才能实现回显功能;但我不理解“-i”在这里为什么是必要的,也不明白为什么有人想要带有“-t”行为的行为而没有“-i”。此外,我也不知道文档中是否有所暗示,"-i"与"-d"或"-a"一起使用是否有用。 - gmr

9

我在这里解释过,-i--interactive即使未连接也保持STDIN开放,这在您想要输入任何命令时是必需的。

这对于管道有帮助:

$ echo hello | docker run -i busybox cat
  hello

含义:-i 不一定需要 -t (tty),其中tty 是文本终端


“not attached” 的确切含义是什么? - Vladimir Panteleev
1
@VladimirPanteleev 连接到 tty。参见 https://dev59.com/mFoV5IYBdhLWcg3wL8aw#36565383 和 https://dev59.com/PFsW5IYBdhLWcg3wDzku#35462735 - VonC
好的,不过最好澄清一下什么是“附加到TTY”。所以,我理解“未附加”曾经意味着“未指定-a”,但-a的含义已经改变,现在不太明显了。因此,更准确地说,如果未指定-d,则缺少-i-a-a stdout -a stderr相同,但使用-i时,则与-a stdin -a stdout -a stderr相同。 - Vladimir Panteleev
@VladimirPanteleev 是的,-i 确实会添加 -a stdin-i 保持容器的标准输入可用,可以是伪终端(-t),也可以是任何管道,在后台模式下运行时。 - VonC

5

来自文档:

对于交互式进程(比如shell),必须使用 -i -t 一起来为容器进程分配一个tty终端。通常 -i -t 会缩写成 -it,在后面的示例中也会看到这种写法。但当客户端从管道中接收标准输入时,指定 -t 是被禁止的,例如:

$ echo test | docker run -i busybox cat

在Unix /Linux中,-t标志是处理终端访问的方式。历史上,终端是一种硬连接,具有真正的硬件部件。

然而,今天使用伪终端驱动程序。

  • 不带任何标志运行容器,默认情况下您拥有一个 stdout (标准输出) 流。
  • 使用-i标志运行,将添加一个 stdin (标准输入) 流,它接受文本作为输入。
  • 通常与-i一起使用-t运行,并添加终端驱动程序,如果您想与进程交互,则可能需要它。基本上使容器开始看起来和感觉像终端会话。

在不使用-i的情况下运行-t意味着您将拥有终端,但是您的输入不会连接到终端输入。


在什么情况下我们需要使用 -t 而不带 -i?如果没有这种情况,为什么 Docker 不直接让 -t 自动获取标准输入呢? - Shuai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接