我觉得命令的--tty和--interactive开关之间有细微的区别docker run,我不明白:
--interactive, -i: 即使没有连接,也要保持 STDIN 打开--tty, -t: 分配一个伪 TTY所以我决定进行一些测试。
首先,我创建了一个基本的 Python 脚本,它连续打印一个字符串。
然后我创建了一个基本的 docker 镜像,它将在容器启动时运行这个脚本。
my_script.py
import time
while True:
time.sleep(1)
print('still running...')
Run Code Online (Sandbox Code Playgroud)
文件
FROM python:3.8.1-buster
COPY my_script.py /
CMD [ "python3", "/my_script.py"]
Run Code Online (Sandbox Code Playgroud)
使用命令构建:
docker build --tag pytest .
Run Code Online (Sandbox Code Playgroud)
测试 1
我运行docker run --name pytest1 -i pytest,以测试容器的交互行为。控制台没有打印任何内容,但是当我按下Control+Cpython 脚本时,该脚本被中断并且容器停止运行。
这证实了我认为标准输入在容器上打开并且我的键盘输入进入了容器的想法。
测试 2
我运行docker run --name pytest1 -t pytest,以测试容器的伪 tty 行为。它反复打印still running...到控制台,当我按下Control+Cpython 脚本时,它被中断并且容器停止运行。
测试 3
我运行docker run --name pytest1 -it pytest,以测试组合行为。行为与测试 2 中的相同。
问题
-it如果-t开关没有任何好处,为什么要使用组合开关,正如您经常看到的那样? --tty开关是否只保持 stdin 和 stdout 打开?-t例如,如果您想与 /bin/sh 这样的 shell 交互,则需要选项。shell 通过控制 tty 来工作。没有可用的 tty,没有 shell。
我们-i结合使用-t能够将命令写入我们打开的外壳
您可以重现一些测试来理解:
docker run alpine /bin/sh:容器退出。shell需要等待stdin
docker run -i alpine /bin/sh:容器保留,但 shell 不会启动。我们无法输入命令
docker run -t alpine /bin/sh: shell 启动,但我们被卡住了,我们按下的键没有被解释
docker run -it alpine /bin/sh: 是的,我们的 shell 正在工作