【发布时间】:2020-01-28 01:31:59
【问题描述】:
我觉得docker run 命令的--tty 和--interactive 开关之间存在细微差别,我不明白:
-
--interactive、-i:即使没有连接,也要保持 STDIN 打开 -
--tty,-t:分配一个伪TTY
所以我决定进行一些测试。
首先,我创建了一个基本的 Python 脚本,它连续打印一个字符串。
然后我创建了一个基本的 docker 镜像,它会在容器启动时运行这个脚本。
my_script.py
import time
while True:
time.sleep(1)
print('still running...')
Dockerfile
FROM python:3.8.1-buster
COPY my_script.py /
CMD [ "python3", "/my_script.py"]
使用命令构建:
docker build --tag pytest .
测试 1
我运行docker run --name pytest1 -i pytest 来测试容器的交互行为。
控制台没有打印任何内容,但是当我按下Control+C 时,python 脚本被中断并且容器停止运行。
这证实了我的想法,即容器上的标准输入是打开的,并且我的键盘输入进入了容器。
测试 2
我运行docker run --name pytest1 -t pytest 来测试容器的伪tty 行为。它反复将still running... 打印到控制台,当我按下Control+C 时,python 脚本被中断并且容器停止运行。
测试 3
我运行docker run --name pytest1 -it pytest 来测试组合行为。行为与测试 2 中的相同。
问题
- 我在这里遗漏了哪些细微差别?
- 如果
-t开关没有任何好处,为什么要使用组合的-it开关,正如您经常看到的那样? -
--tty开关是否只保持标准输入和标准输出打开?
【问题讨论】: