首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对分配伪TTY的Docker -t选项感到困惑

对分配伪TTY的Docker -t选项感到困惑
EN

Stack Overflow用户
提问于 2015-05-09 07:11:59
回答 8查看 114.1K关注 0票数 366

这个选项到底是做什么的?我在TTY上读了很多书,我还是很困惑。我在没有-t-i的情况下四处游玩,看起来就像那些期望用户输入的程序在没有-t时抛出一个错误。为什么启用伪TTY很重要?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2016-10-13 17:00:22

-t选项用于Unix/Linux如何处理终端访问。在过去,终端是硬线连接,后来是基于调制解调器的连接。它们有物理设备驱动程序(它们是真正的设备)。一旦通用网络投入使用,就开发了一个伪终端驱动程序.这是因为它在理解可以使用哪些终端功能而不需要将其直接写入程序(在sttycurses上读取手册页)之间造成了分离。

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

票数 429
EN

Stack Overflow用户

发布于 2015-08-20 05:54:46

在Docker文档中提到了它是为了“分配一个伪tty”,并且经常与-i一起使用。

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

我在文档中看到它以如下方式使用于出色的jwilder/nginx-proxy码头容器:

代码语言:javascript
复制
docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx

在本例中,它所做的是将输出发送到这个停靠器容器中的“虚拟”tty (Bash命令提示符/终端)。然后,您可以通过运行docker命令docker logs CONTAINER看到这个输出,其中CONTAINER是容器ID的前两个字符。

我在下面的链接中简要地提到了这个-t论点,它说

-t-i标志分配一个伪tty,即使不附加stdin,也可以保持stdin打开。这将允许您像传统的VM一样使用容器,只要bash提示符正在运行。

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

票数 77
EN

Stack Overflow用户

发布于 2021-06-18 02:47:31

这里的大多数答案都是很好的概念性答案,但我发现它们遗漏了太多的细节,使我无法在电脑前使用这些信息。艾哈迈德·格诺明的答案正在向程序化的方向发展,但让我们再向前推进一步。

首先是一些理论

TTY神秘感中的两个图像是关键:

我不能声称完全理解这幅图片,但这里的兴趣关系是,当xterm (或以ubuntu为单位的gnome终端;由上面图像中的“用户进程”气泡之一表示)打开时,它会启动bash (或任何默认的shell),然后通过内核伪终端(PTY)主从发送键盘输入:

xterm -> ptmx (pty master) -> pts (pty slave) -> bash

第二个图像表示在这个简短的bash会话中涉及的进程:

代码语言:javascript
复制
>>> cat
>>> ls | sort
...

关键信息位是TTY和stdin、stdout、stderr线。这表明每个进程都与TTY (电传打字机终端)相关联,并且它们的3个流(stdin、stdout、stderr)非常自然地与此TTY相关联,除非是管道或重定向(请注意,管道ls | sort将ls的stdout与stdin的stdout关联起来)。

现在来验证一下这个理论

我们可以通过键入tty找到bash使用的伪终端。

代码语言:javascript
复制
>>> tty
/dev/pts/2

因此,Bash与PTY从编号2相关联(这可能意味着有另一个终端处于打开状态,与主/从对1相关联)。我们还可以获得bash的stdin、stdout和stderr流:

代码语言:javascript
复制
>>> ls -l /proc/$$/fd
lrwx------ 1 samlaf samlaf 64 Jun 17 21:50 0 -> /dev/pts/2
lrwx------ 1 samlaf samlaf 64 Jun 17 21:50 1 -> /dev/pts/2
lrwx------ 1 samlaf samlaf 64 Jun 17 21:50 2 -> /dev/pts/2

事实上,它们都与bash的自然TTY奴隶有关。($$是一个bash变量,它返回bash的PID。我们同样可以通过使用ps并手工键入它来找到它。

最后用这个理论回答了最初的码头工人问题。

我们重复上面的步骤,但这次是在一个码头容器中:

代码语言:javascript
复制
>>> docker run --rm -t ubuntu tty
/dev/pts/0
>>> docker run --rm ubuntu tty
not a tty

这是有道理的,因为-t 分配伪终端

-i相关的命令更难解释。

代码语言:javascript
复制
>>> docker run --rm ubuntu bash -c "ls -l /proc/\$\$/fd"
lrwx------ 1 root root 64 Jun 18 02:37 0 -> /dev/null
l-wx------ 1 root root 64 Jun 18 02:37 1 -> pipe:[9173789]
l-wx------ 1 root root 64 Jun 18 02:37 2 -> pipe:[9173790]
>>> docker run --rm -t ubuntu bash -c "ls -l /proc/\$\$/fd"
lrwx------ 1 root root 64 Jun 18 02:39 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 18 02:39 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 18 02:39 2 -> /dev/pts/0
>>> docker run --rm -it ubuntu bash -c "ls -l /proc/\$\$/fd"
lrwx------ 1 root root 64 Jun 18 02:39 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 18 02:39 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 18 02:39 2 -> /dev/pts/0

我还是不知道-i到底做了什么..。我很想帮忙!我能找到的唯一有趣的命令是:

代码语言:javascript
复制
>>> docker run --rm -a stdout -i ubuntu bash -c "ls -l /proc/\$\$/fd"
lr-x------ 1 root root 64 Jun 18 02:43 0 -> pipe:[9199896]
l-wx------ 1 root root 64 Jun 18 02:43 1 -> pipe:[9199897]
l-wx------ 1 root root 64 Jun 18 02:43 2 -> pipe:[9199898]
>>> docker run --rm -a stdout ubuntu bash -c "ls -l /proc/\$\$/fd"
lrwx------ 1 root root 64 Jun 18 02:43 0 -> /dev/null
l-wx------ 1 root root 64 Jun 18 02:43 1 -> pipe:[9197938]
l-wx------ 1 root root 64 Jun 18 02:43 2 -> pipe:[9197939]

Docker 文档提到-a“附加到作为输入传递的流”,但我还没有找到解释这意味着什么,以及它与-i选项之间的关系。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30137135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档