它在Docker里到底是做什么的?[复制]

jyztefdp  于 2023-01-29  发布在  Docker
关注(0)|答案(2)|浏览(111)
    • 此问题在此处已有答案**:

what is docker run -it flag?(3个答案)
5小时前关门了。
在执行此命令时,我不能只省略it来使bash工作。

sudo docker exec -it 69e937450dab bash

它到底是做什么的?什么时候我需要没有这些参数的命令?

afdcj2ne

afdcj2ne1#

在容器中运行交互式环境会话需要使用-i和-t标志:
-i通过保持STDIN打开(即使未连接)使会话交互-t分配伪TTY,允许您使用终端与容器交互

wmomyfyw

wmomyfyw2#

我自己来回答:
不带任何标志的正常执行:

[ec2-user@ip-172-31-109-14 ~]$ sudo docker exec 69e937450dab ls
bin
boot
dev
docker-entrypoint.d
docker-entrypoint.sh
etc

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

[ec2-user@ip-172-31-109-14 ~]$ echo test | sudo docker exec 69e937450dab cat

不会显示任何内容,因为没有输入流进入Docker容器,这可以通过-i标志来实现。

[ec2-user@ip-172-31-109-14 ~]$ echo test | sudo docker exec -i 69e937450dab cat
test

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

sudo docker exec 69e937450dab bash

你什么也看不到,因为进程是在容器中启动的。添加标记将完成交易:

[ec2-user@ip-172-31-109-14 ~]$ sudo docker exec -t 69e937450dab bash
root@69e937450dab:/#

但这实际上并没有什么帮助,因为我们需要一个输入流,它接受我们的命令并可以被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:/#

简短回顾:
-t用于将bash进程附加到我们的终端
-i用于能够通过STDIN发送输入,例如使用键盘发送到容器中的bash
不带-i可以用于不需要输入的命令;不带-t和bash可以用于只需要使用一个命令的情况。

相关问题