什么是docker run -it flag?

Ale*_*lex 64 docker dockerfile

我正在用docker做一些复杂的事情,但结果我不知道-it标志是什么意思.最近我遇到了一些令docker run我困惑的命令的例子.

docker run -itd ubuntu:xenial /bin/bash 
Run Code Online (Sandbox Code Playgroud)

我的问题是-it,如果在实例化期间运行容器,那么在这里写标志是有意义的bin/bash

在文档中我们有一个例子

docker run --name test -it debian
Run Code Online (Sandbox Code Playgroud)

有解释

-it指示Docker分配连接到容器的stdin的伪TTY; 在容器中创建交互式bash shell.

和帮助页面中-t标志的说明

-t, - try分配伪TTY

如果我删除-it标志期间

docker run -d ubuntu:xenial /bin/bash
Run Code Online (Sandbox Code Playgroud)

我新创建的容器并没有那么多

docker ps -a

它被指定为退出

对不起,如果我的问题很愚蠢,我在互联网上找不到解释(我对这一点有很大的误解).

Fen*_*iko 65

-it--interactive + --tty当你docker run使用这个命令时它很简短..它会直接带你到容器里面,这里-d很短,--detach这意味着你只需要运行容器,然后从中分离,所以基本上你在后台运行容器.. 编辑:所以如果您使用-itd它运行docker容器将运行-it选项并将您从容器中分离,因此即使没有任何默认应用程序运行,您的容器仍然在后台运行..

  • 这意味着您的容器中存在错误..所以您的容器无法启动...或者默认情况下它没有任何`CMD`命令,因此默认情况下它没有运行任何应用程序。.so 如果你在后台运行它,它会立即退出,因为它没有任何工作要做。. (2认同)
  • @Alex,...需要明确的是,如果您在没有 Docker 的情况下运行它,`/bin/bash </dev/null` 也会立即退出。运行不带“-i”的“docker run”会对它启动的“bash”副本执行相同的操作。(如果没有“-t”,它有一个标准输入,但没有 TTY,因此它不会将自己检测为交互式 shell,因此您会得到一组略有不同的行为)。 (2认同)
  • @AdmiralAdama,解决颜色问题的是 -t 选项。需要 TTY 来理解颜色标记。 (2认同)

dvn*_*yen 30

docker run -it ubuntu:xenial /bin/bash以交互模式启动容器(因此-it标记),允许您与/bin/bash容器进行交互.现在这意味着你将有bash会话内部的容器,这样你就可以ls,mkdir或者做容器内任意bash命令.

这里的关键是"互动"这个词.如果省略该标志,则容器仍会执行/bin/bash但会立即退出.使用该标志,容器执行/bin/bash然后耐心地等待您的输入.

  • 你是对的。我收回我的话。如果没有 `-t` 标签,您仍然可以与容器交互,但是有了它,您将拥有一个更好、更多功能的终端。你可以使用 `-i` 和 `-it` 来查看不同之处。 (6认同)
  • 那么我需要使用 -t 标志吗?`docker run -i ubuntu:xenial /bin/bash` (3认同)
  • -t:伪tty或“伪终端”。没有终端,就无法将输入发送到容器。 (2认同)

Dav*_*vid 10

没有任何标志的正常执行:

[ec2-user@ip-172-31-109-14 ~]$ sudo docker exec 69e937450dab ls
bin
boot
dev
docker-entrypoint.d
docker-entrypoint.sh
etc
Run Code Online (Sandbox Code Playgroud)

如果你的命令需要像 cat 这样的输入,你可以尝试:

[ec2-user@ip-172-31-109-14 ~]$ echo test | sudo docker exec 69e937450dab cat
Run Code Online (Sandbox Code Playgroud)

什么也不会显示,因为没有输入流进入 docker 容器。这可以通过 -i 标志来实现。

[ec2-user@ip-172-31-109-14 ~]$ echo test | sudo docker exec -i 69e937450dab cat
test
Run Code Online (Sandbox Code Playgroud)

现在,让我们假设,您希望 bash 作为进程启动:

sudo docker exec 69e937450dab bash
Run Code Online (Sandbox Code Playgroud)

您将看不到任何内容,因为该进程是在容器中启动的。添加标志就可以了:

[ec2-user@ip-172-31-109-14 ~]$ sudo docker exec -t 69e937450dab bash
root@69e937450dab:/# 
Run Code Online (Sandbox Code Playgroud)

但这并没有真正的帮助,因为我们需要一个输入流,它接受我们的命令并可以被 bash 接收。因此,我们需要将两者结合起来:

[ec2-user@ip-172-31-109-14 ~]$ sudo docker exec -i -t 69e937450dab bash
root@69e937450dab:/# ls
bin  boot  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  hi  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@69e937450dab:/# 
Run Code Online (Sandbox Code Playgroud)

小回顾:

-t 用于将 bash 进程附加到我们的终端

-i 能够通过 STDIN 发送输入,例如使用键盘发送到容器中的 bash

没有 -i 可以用于不需要输入的命令。当您不想将 docker 容器进程附加到 shell 时,可以使用没有 -t 和 bash 的选项。


Isk*_*4yo 10

我想为像我这样的新手添加一些直觉。

-it是命令的标志docker rundocker container run(它们是别名)。建议您了解什么是标志并继续:

  • -i--interactive
    当您键入时,docker run -i这意味着您的终端会将您的输入传输到容器(容器中的应用程序),直到您按ctrl-D(离开容器)。例如,如果某个应用程序在等待用户输入的容器中运行,您可以输入一些内容,该内容将被转发到该应用程序。
  • -t-tty(伪 TTY):
    如果添加此标志,容器的输出将附加到终端。似乎主要是关于格式化输出(例如bin/bash,尝试使用ls和不使用-t标志),但有时更重要,因为某些应用程序根据是否通过终端启动来改变其行为(例如,文本编辑器或屏蔽密码的机制)和*终端实现)。

将两个标志组合为-it使您有机会使容器获取标准输入并从容器获得良好的格式化输出,就像您正在使用漂亮的本机自己的终端一样。

后续行动

  • docker 如何理解哪个应用程序将获取我的 stdin(标准输入)?
    当您输入时docker run -i <image> <app>,最后一个参数 ( <app>) 将获取您的输入。
  • 这两个标志的实际应用是什么?
    • -i当您想与容器中的应用程序交互时很有用,但获取格式化输出对您来说并不重要。例如,您想要将数据发送到容器,从中获取数据并将其保存到文件中。在这种情况下-t是没有必要的。
    echo "my input" | docker run -i <image> > output.txt
    
    Run Code Online (Sandbox Code Playgroud)
    • -t当您想要类似终端的输出但不需要将输入传输到容器时非常有用。假设您有一个在容器内启动的脚本,以特定格式输出数据,然后该数据被另一个脚本使用:
    docker run -t my-image | my-processing-script.sh
    
    Run Code Online (Sandbox Code Playgroud)