在阅读不同的书籍、文章和论坛帖子时,我经常看到以下Docker Run命令:
docker run -tid <dockerimage>
我真正不理解的是:使用 -d 启动一个 已分离 的容器,是否有意义添加 -i 以及 -t 选项呢?
我的意思是,分离的容器永远不会提示您进入控制台,因此我认为使用 -it 不是必要的。
在阅读不同的书籍、文章和论坛帖子时,我经常看到以下Docker Run命令:
docker run -tid <dockerimage>
我真正不理解的是:使用 -d 启动一个 已分离 的容器,是否有意义添加 -i 以及 -t 选项呢?
我的意思是,分离的容器永远不会提示您进入控制台,因此我认为使用 -it 不是必要的。
-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
的行为如下:
-it
,docker run
会立即给您提供bash提示符。-itd
,docker run
会立即退出,但您可以在此之后使用docker attach
并获得bash提示符,就像您刚刚执行了docker run -it
一样。-d
选项(在@Joshua Chia的答案中很好地解释了):容器存在是因为/bin/bash
退出了。而/bin/bash
之所以退出,是因为标准输入不再打开。在第二种情况下,使用-itd
选项,Docker保持bash的标准输入打开状态,以便您可以重新附加。 - Manuel Schmidt我认为一般来说,启动一个类似这样的独立交互式容器是一个不寻常的用例。在我的日常使用docker中,我从未使用过它。
某些应用程序在其标准输出与tty相关联时可能会表现出不同的行为(例如,当它们的输出是终端时,它们可能只默认记录到stdout,或者如果您运行一个shell,则可能仅退出而不关联终端)。
您可能希望docker attach
到正在运行的容器。如果您已经启动了某种分离的shell,则这尤其重要。