这个选项到底有什么作用?我读了很多关于TTY的文章,但我还是很困惑。我没有使用-t,只使用-i,看起来程序需要用户输入而不使用-t就会抛出错误。为什么启用伪tty很重要?


当前回答

每个进程都有三个数据流,即STDIN/ STDOUT/ STDERR。当一个进程在容器中运行时,默认情况下终端与该进程的STDOUT流连接。因此,当在终端中运行docker run命令时,所有的输出流都是可见的。但是如果你想为容器中正在运行的进程提供输入,那么你必须连接进程的STDIN通道,这不是默认情况,而是通过docker run -i命令完成的。

-t用于交互式/格式化的输入操作。

其他回答

每个进程都有三个数据流,即STDIN/ STDOUT/ STDERR。当一个进程在容器中运行时,默认情况下终端与该进程的STDOUT流连接。因此,当在终端中运行docker run命令时,所有的输出流都是可见的。但是如果你想为容器中正在运行的进程提供输入,那么你必须连接进程的STDIN通道,这不是默认情况,而是通过docker run -i命令完成的。

-t用于交互式/格式化的输入操作。

在linux中,当你运行一个命令时,你需要一个终端(tty)来执行它。

因此,当你想要连接到docker(或在docker容器中运行命令)时,你必须提供选项-t,它考虑到docker容器中的终端。

-it组合选项称为交互模式。

默认情况下,容器只有一个标准输出流(即docker run | CMD works),要与我们的容器交互,我们需要以下两个选项:

-i添加一个stdin流(即CMD | docker run works); -t分配一个伪tty主/从对,从部分绑定到容器中正在运行的进程,主部分绑定到docker命令。

stdin流将容器附加到您的shell的stdin流(docker继承了您的shell的stdin流),而TTY行规程使您能够以键盘方式与容器交互。

TTY行规程由内核提供给TTY设备的低级特性组成,例如编辑缓冲区和基本的行编辑命令。

如下所示,您可以使用以下命令检查标准文件描述符:

docker run --rm -i ubuntu sh -c "ls -l /proc/\$\$/fd"

如果你移除-i,你会看到stdin指向/dev/null(也就是说,没有分配流)。

我对-t的了解如下:

docker exec -ti CONTAINER bash允许我在容器中“登录”。感觉像嘘嘘(其实不是)。

但问题是当我想恢复数据库时。

通常我dodocker exec -ti mysql.5.7 mysql -这里我在容器中执行mysql命令并获得一个交互式终端。

我添加了<dump。sql到前面的命令,以便我可以恢复一个db。但是它失败了,不能在非tty输入上启用tty模式。

删除-t会有所帮助。还是不明白为什么:

docker exec -i mysql.5.7 mysql < dump.sql

最后一个可行。希望这能帮助到人们。

-it指示Docker分配一个伪tty连接到容器的stdin,在容器中创建一个交互式bash shell。

——interactive, -i false保持STDIN打开,即使没有附加

——tty, -t false分配一个伪tty

https://docs.docker.com/engine/reference/commandline/run/