Docker - 分离模式和交互模式?

29

在阅读不同的书籍、文章和论坛帖子时,我经常看到以下Docker Run命令:

docker run -tid <dockerimage>

我真正不理解的是:使用 -d 启动一个 已分离 的容器,是否有意义添加 -i 以及 -t 选项呢?

我的意思是,分离的容器永远不会提示您进入控制台,因此我认为使用 -it 不是必要的。

3个回答

49

-i(交互式)是关于是否保持stdin打开的(有些程序,如bash,使用stdin,而其他程序则不使用)。-d(分离式)是关于docker run命令是否等待正在运行的进程退出。因此,它们是正交的,本质上不矛盾。像bash这样的程序在stdin关闭时退出,因此没有-i,它会立即退出。

-t(tty)分配一个伪终端。您可以通过使用-it与仅使用-i来查看运行bash的区别。例如,没有-t,您不会得到任何提示,而ls会以一列显示结果。这个区别就像从普通的bash会话中运行ls和从普通的bash会话中运行ls | cat之间的区别,其中cat没有伪终端。

当您在容器中运行docker run bash时,-it-itd的行为如下:

  • 使用-itdocker run会立即给您提供bash提示符。
  • 使用-itddocker run会立即退出,但您可以在此之后使用docker attach并获得bash提示符,就像您刚刚执行了docker run -it一样。

调试了几个小时卡住的容器问题后,这个答案挽救了我的一天。非常感谢!(实际上我使用了-d,但没有使用-itd,所以在一个printf之后停止工作了) - Netzdoktor
2
应该是被接受的答案。感谢您澄清了-i的作用,以及当entrypoint可执行文件存在时容器将存在以及bash、sh等的操作方式。 - Jangita

21
当您仅使用-d选项运行图像时,容器将在命令执行后立即退出。如果您使用-itd选项运行,则容器将被分离但在后台运行,并且您可以在需要时重新附加。有关更多详细信息,请参见附加的截屏。

enter image description here


谢谢,解释和演示非常完美。 - Christoph Forster
2
我在这个答案中错过的重要一点是容器为什么在第一个情况下立即存在,即使用-d选项(在@Joshua Chia的答案中很好地解释了):容器存在是因为/bin/bash退出了。而/bin/bash之所以退出,是因为标准输入不再打开。在第二种情况下,使用-itd选项,Docker保持bash的标准输入打开状态,以便您可以重新附加。 - Manuel Schmidt

2

我认为一般来说,启动一个类似这样的独立交互式容器是一个不寻常的用例。在我的日常使用docker中,我从未使用过它。

某些应用程序在其标准输出与tty相关联时可能会表现出不同的行为(例如,当它们的输出是终端时,它们可能只默认记录到stdout,或者如果您运行一个shell,则可能仅退出而不关联终端)。

您可能希望docker attach到正在运行的容器。如果您已经启动了某种分离的shell,则这尤其重要。


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