docker 运行 带有 --interactive 和 --tty 标志

docker run with --interactive and --tty flag

编辑:

有人标记了 this question 的副本,但它根本没有解释底层机制。

但是相比之下,解决了案例一的困惑,但案例二没有


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

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


案例一

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

容器正在 运行正在接受输入

根据 document,--interactive 标志用于

Keep STDIN open even if not attached

没看懂即使不附加是什么意思,附加什么?


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

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

请帮忙。

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

  • 附加
  • 执行

--互动标志

正如你提到的那样

Keep STDIN open even if not attached

根据我的理解,这意味着它将读取您的 terminal/console 的输入并对其做出反应或呈现输出。如果你 运行 docker run --tty alpine /bin/shdocker run --tty --interactive alpine /bin/sh--interactive 的人会对此做出反应。

附加

Attach to a running process

如果docker容器是使用/bin/bash命令启动的,你可以使用attach访问它,如果不是那么你需要执行命令在里面创建一个bash实例使用 exec.

的容器

更深入:如果docker容器是使用/bin/bash启动的,那么它将成为容器PID 1并且attach命令将附加你到 PID 1.

执行

Creates new process

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

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

请参阅此处 -i 用于交互,-t 用于 --tty,即伪 TTY。交互式,以便您可以在此命令提示时输入。

您需要提供 -i/--interactive 选项以将您的终端 STDIN 转发到容器的 sh。

试试这个:

docker start -ai CONTAINER

https://docs.docker.com/engine/reference/commandline/start/