我阅读了一些 docker 文档,但我不明白这可能意味着什么
- 附加一个 tty
- 附加标准输入和标准输出
出于这些目的,我看到使用了 -i
和 -t
标志。
这个过程是什么意思?
原文由 Phil 发布,翻译遵循 CC BY-SA 4.0 许可协议
我阅读了一些 docker 文档,但我不明白这可能意味着什么
出于这些目的,我看到使用了 -i
和 -t
标志。
这个过程是什么意思?
原文由 Phil 发布,翻译遵循 CC BY-SA 4.0 许可协议
通过使用 lsof
命令,我们可以看到幕后发生的事情。作为演示,我们可以从只运行 sleep 的 Debian 映像创建一个简单的 docker 容器:
docker run -d --name tty-test debian /bin/bash -c "sleep 1000"
这将在新容器中启动 sleep 命令(请注意,我们没有使用 -i
或 -t
)。
接下来,我们通过 exec
命令“登录”到我们的容器并启动 bash:
docker exec -it tty-test /bin/bash
一个普通的 debian 镜像不会安装 lsof
所以我们需要安装它:
apt update && apt install -y lsof
接下来我们运行 lsof:
lsof
如果不带任何选项运行, lsof
将打印所有正在运行的进程的打开文件。您应该在其输出中看到三个进程(睡眠、bash 和 lsof 本身)。
以下是显示文件描述符(FD 列)的相关行 0
到 2
。
Note how the sleep
process, which we started without the -t option has three FIFO pipes for stdin
, stdout
and stderr
:
sleep 1 root 0r FIFO 0,10 0t0 8226490 pipe
sleep 1 root 1w FIFO 0,10 0t0 8226491 pipe
sleep 1 root 2w FIFO 0,10 0t0 8226492 pipe
虽然 bash
进程有一个实际设备连接到 stdin
, stdout
和 stderr
bash 7 root 0u CHR 136,15 0t0 18 /dev/pts/15
bash 7 root 1u CHR 136,15 0t0 18 /dev/pts/15
bash 7 root 2u CHR 136,15 0t0 18 /dev/pts/15
让我们使用 -t
选项创建另一个容器:
docker run -d -t --name tty-test2 debian /bin/bash -c "sleep 1000"
再次安装 lsof
后(见上文)我们从 lsof
得到不同的输出 sleep
进程:
sleep 1 root 0u CHR 136,15 0t0 18 /15
sleep 1 root 1u CHR 136,15 0t0 18 /15
sleep 1 root 2u CHR 136,15 0t0 18 /15
请注意类型列如何更改为 CHR
并且名称列显示 /15
。
最后,当我们从 exec
命令中省略 -t
选项时,如下所示:
docker exec -it tty-test /bin/bash
然后我们可以注意到两件事。首先,我们现在没有从 bash 获得 shell 提示,但我们仍然可以键入命令并查看它们的输出。 When we run lsof
we see that the bash
process now also has pipes rather then a tty attached to stdin
, stdout
, and stderr
bash 379 root 0r FIFO 0,10 0t0 8263037 pipe
bash 379 root 1w FIFO 0,10 0t0 8263038 pipe
bash 379 root 2w FIFO 0,10 0t0 8263039 pipe
原文由 lanoxx 发布,翻译遵循 CC BY-SA 3.0 许可协议
1 回答653 阅读✓ 已解决
1 回答597 阅读
2 回答643 阅读✓ 已解决
stdin, stdout, and ttys
是相关概念。stdin
和stdout
是一个进程的输入输出流。 A pseudo terminal (also known as atty
or apts
) connects a user’s “terminal” with thestdin
andstdout
stream,通常(但不一定)通过诸如bash
类的外壳。我在“终端”周围使用引号,因为我们今天真的不使用同样意义上的终端。在 docker 的情况下,当您以交互模式运行进程时,例如启动
bash
shell 时,您经常会同时使用-t
和-i
。对于 shell,您希望能够发出命令并读取输出。docker 用来附加的代码
stdout/stdin
包含所有脏细节。