为什么docker run -t阻止bash进程退出和停止容器

Ahm*_*nim 1 bash docker

我知道一旦主进程(命令)结束,docker容器就会停止.

我也明白-t会分配一个伪TTY

docker run -t <image> <command>
Run Code Online (Sandbox Code Playgroud)

现在,当我默认运行bash时,容器会立即停止,这是预期的

docker run fedora bash
docker -ps =>(this gives empty list)
Run Code Online (Sandbox Code Playgroud)

但是当我像这样用-t运行bash时

docker run -t fedora bash
[CTRL+C]
docker ps =>(this shows one running container)
Run Code Online (Sandbox Code Playgroud)

为什么-t保持bash进程运行?虽然相同的-t不会保持,例如,echo运行

docker run -t fedora echo "hello"
[CTRL+C]
docker ps =>(this shows empty list although we added -t)
Run Code Online (Sandbox Code Playgroud)

anu*_*ava 5

当你bash没有使用时,-t它立即退出状态0,因为你没有提供任何bash使用-c选项的命令.

通过使用,-t您将分配一个伪tty进行bash处理.但是-i,STDIN即使没有附加,您也没有使用另一个保持打开的重要选项.没有-i你不能在里面输入任何内容bash因此bash继续运行等待下一个命令.

echo命令以状态0立即退出,因为echo它不是一个交互式进程bash.

所以正确的方法bash是:

docker run -it fedora bash
Run Code Online (Sandbox Code Playgroud)

根据官方文件:

对于交互式进程(如shell),必须-i -t一起使用才能为容器进程分配tty.-i -t经常写-it.