Docker -t选项分配一个伪TTY的困惑

这个选项到底是做什么的? 我一直在阅读很多关于TTY的内容,但我仍然感到困惑。 我玩了没有-t和只是-i ,看起来像程序,希望用户input抛出一个错误,没有-t 。 为什么重要的是启用伪TTY?

根据谷歌的search,“-t”的说法没有很好的logging,或者经常被很多人提到。

在Bash提示符(最新版本为1.8.1)中input“docker”,显示所有docker客户端参数(应该是什么)的列表时,甚至不会显示出来。

事实上,如果你试图通过input“docker -t –help”得到这个参数的具体帮助,如果给出这个惊人的含糊的答复:

“标志提供但没有定义:-t”

所以,你不能因为这个论点而感到困惑!

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

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

我看到它在以下方式在极好的jwilder / nginx代理泊坞窗容器的文档中使用:

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

在这种情况下,它所做的是将输出发送到此泊坞窗容器内的'虚拟'tty(Bash命令提示符/terminal)。 然后,您可以通过运行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

我希望这有帮助! 我不知道为什么这没有logging或使用太多。 也许它是实验性的,将在即将到来的版本中作为logging的function来实现。

“-t”选项用于Unix / Linux如何处理terminal访问。 在过去,terminal是强硬的连接,后来是基于调制解调器的连接。 这些有物理设备驱动程序(他们是真正的设备)。 一旦广义networking投入使用,就开发了一个伪terminal驱动程序。 这是因为它在理解可以使用什么terminalfunction而不需要直接写入程序(在sttycurses上阅读手册页)之间产生了分离。

所以,作为背景,运行一个没有选项的容器,默认情况下你有一个stdoutstream(所以docker run | <cmd>工作); 以“-i”运行,并添加stdinstream(所以<cmd> | docker run -i工作); 使用“-t”,通常在“-it”组合中,并且添加了一个terminal驱动程序,如果您正在与进程进行交互,可能是您想要的。 它基本上使容器启动看起来像一个terminal连接会话。

我所知道的-t是以下内容:

docker exec -ti CONTAINER bash – 允许我在容器中“login”。 感觉就像是ssh(不是)。

但麻烦是当我想恢复一个数据库。

通常我做docker exec -ti mysql.5.7 mysql – 在这里我执行容器中的mysql命令并获得一个交互式terminal。

我添加了<dump.sql到前面的命令,所以我可以恢复一个数据库。 但是它不能cannot enable tty mode on non tty input

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

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

最后一个工程。 希望这有助于人们。

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

 --interactive, -i false Keep STDIN open even if not attached --tty, -t false Allocate a pseudo-TTY 

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