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


当前回答

Docker在线文档中提到它是“分配一个伪tty”,经常与-i一起使用:

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

我在jwilder/nginx-proxy docker容器的文档中看到它是这样使用的:

docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx

在这种情况下,它所做的是将输出发送到docker容器中的“虚拟”tty (Bash命令提示符/终端)。然后,您可以通过运行docker命令docker logs CONTAINER查看此输出,其中CONTAINER是容器ID的前两个字符。这个CONTAINER ID可以通过输入docker ps -a找到

我在下面的链接中看到了这个-t参数,它说

-t和-i标志分配一个伪tty并保持stdin打开 如果没有附上。这将允许您使用容器像 只要bash提示符在运行。

https://coreos.com/os/docs/latest/getting-started-with-docker.html

其他回答

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

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

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

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

Docker在线文档中提到它是“分配一个伪tty”,经常与-i一起使用:

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

我在jwilder/nginx-proxy docker容器的文档中看到它是这样使用的:

docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx

在这种情况下,它所做的是将输出发送到docker容器中的“虚拟”tty (Bash命令提示符/终端)。然后,您可以通过运行docker命令docker logs CONTAINER查看此输出,其中CONTAINER是容器ID的前两个字符。这个CONTAINER ID可以通过输入docker ps -a找到

我在下面的链接中看到了这个-t参数,它说

-t和-i标志分配一个伪tty并保持stdin打开 如果没有附上。这将允许您使用容器像 只要bash提示符在运行。

https://coreos.com/os/docs/latest/getting-started-with-docker.html

-t选项表示Unix/Linux如何处理终端访问。在过去,终端是硬线连接,后来是基于调制解调器的连接。它们具有物理设备驱动程序(它们是真正的设备部件)。一旦广义网络投入使用,伪终端驱动程序就被开发出来。这是因为它在理解哪些终端功能可以使用而不需要直接将其写入程序之间产生了分离(阅读stty, curses的手册页)。

因此,以它为背景,运行一个没有选项的容器,默认情况下,你有一个标准输出流(因此docker运行| <cmd>工作);使用-i运行,你会添加stdin流(所以<cmd> | docker Run -i works);使用-t,通常在-it和您添加的终端驱动程序的组合中使用-t,如果您正在与进程交互,这可能是您想要的。它基本上使容器开始看起来像一个终端连接会话。

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

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

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

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