无任何标志的正常执行:
[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作为进程启动:
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:/
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 使我们能够通过标准输入(例如使用键盘)向容器中的Bash发送输入。
没有-i选项可用于不需要输入的命令。当您不想将Docker容器的进程连接到您的shell时,可以不带-t和Bash使用。
/bin/bash
在标准输入上没有可用的内容,则它没有要运行的命令和提示用户的方式,因此它会退出。这是100%正常和预期的行为。 - Charles Duffy