首页 > 解决方案 > docker 使用 --interactive 和 --tty 标志运行

问题描述

编辑:

有人标记了这个问题的重复,但它根本没有解释底层机制。

但相比之下,这个堆栈溢出解决了我在案例 I 中的困惑,而不是案例 II


我是 docker 的新手,我对 --interactive、--attach 标志和所涉及的概念的使用感到困惑

我将在 docker hub 中使用busybox来展示我的困惑。


案例一

当我使用以下命令运行容器时。docker run --interactive --tty busybox sh

容器正在运行并接受输入 在此处输入图像描述

根据文档,--interactive 标志用于

即使没有连接,也保持 STDIN 打开

我不明白即使不依附,依附于什么是什么意思?


案例二:然后我退出容器并尝试使用 docker start --attach abdd796820b1.

终端似乎也接受输入,但是当我输入 ls 或 echo 时,它没有给出响应。 在此处输入图像描述 --attach 标志做了什么?

请帮忙。

标签: dockercontainersinteractiveflags

解决方案


您可以通过两种方式与正在运行的容器进行交互

  • 执行

--交互式标志

正如你提到的,它已经说过

即使没有连接,也保持 STDIN 打开

据我了解,这意味着它将从您的终端/控制台读取输入并对其做出反应或呈现输出。如果你运行docker run --tty alpine /bin/sh并且docker run --tty --interactive alpine /bin/sh. 一个--interactive会对此做出反应。

附加到正在运行的进程

如果 docker 容器是使用/bin/bash命令启动的,则可以使用 attach 访问它,如果没有,则需要执行命令以使用exec.

更深入:如果开始使用 docker 容器,/bin/bash那么它将成为容器 PID 1,并且attach命令会将您附加到 PID 1。

执行

创建新进程

如果您想在容器内创建一个新进程而不是 exec,它就像exec用于在容器内执行apt-get命令而不附加到它或运行节点或 python 脚本。

例如:docker exec -it django-prod python migrate

See here-i是交互式的,并且-t--tty伪 TTY。交互式,以便您可以在此命令提示某些内容时输入。


推荐阅读