【问题标题】:Difference between the docker run --tty and --interactive switchesdocker run --tty 和 --interactive 开关之间的区别
【发布时间】: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 开关是否只保持标准输入和标准输出打开?

【问题讨论】:

    标签: python docker


    【解决方案1】:

    -t 如果您想与 /bin/sh 等 shell 交互,则需要选项。 shell 通过控制 tty 来工作。没有可用的 tty,没有 shell。

    我们将-i-t 结合使用,以便能够将命令写入我们打开的shell

    你可以重现几个测试来理解:

    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 正在工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 2023-02-08
      • 2019-04-11
      • 1970-01-01
      相关资源
      最近更新 更多