Docker新手求教:docker run命令中--attach选项的工作原理
我是一名Docker新手,目前对docker run命令中的--attach选项的工作原理十分困惑。
我已理解以下命令:使用-it参数时,Docker会创建一个伪终端(pseudo-tty)并在其中执行/bin/bash命令,同时将本地终端的标准输入(stdin)和标准输出(stdout)与该伪终端关联。
$ docker run --rm -it ubuntu /bin/bash root@d5e3551114ca:/# ls bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
但我无法理解以下几个命令的含义及对应的现象,下面逐一解析:
1. 本地终端无输出,但docker logs可见执行结果
命令:
docker run --rm --attach stdin -i ubuntu /bin/bash
现象:本地终端无输出,但docker logs中可见按键输入已被捕获并执行。
解析:--attach stdin仅将容器的标准输入与本地终端关联,-i参数保证容器的stdin保持打开状态,但未关联容器的stdout/stderr,也未分配伪终端(-t)。bash作为交互式shell,在没有stdout关联到终端时不会输出提示符,但输入的命令会正常执行,执行结果写入容器的stdout,因此只能通过docker logs查看输出内容。
2. 容器启动后立即停止
命令:
docker run --rm --attach stdin ubuntu /bin/bash
现象:容器启动后立即停止。
解析:--attach stdin虽然关联了容器的stdin,但缺少-i参数,容器启动后stdin会立刻关闭。bash作为交互式shell,必须依赖打开的stdin才能持续运行,一旦stdin关闭,bash进程就会退出,容器也随之停止。
3. 容器启动,但输入无响应、无输出
命令:
docker run --rm --attach stdin -t ubuntu /bin/bash
现象:容器启动,但按键输入未被捕获,也无输出显示。
解析:-t参数为容器分配了伪终端,但仅通过--attach stdin关联了标准输入,未关联stdout/stderr,因此伪终端的输出无法传递到本地终端,看不到提示符和命令结果;同时未加-i参数,容器的stdin并未保持打开,本地终端的输入无法被容器接收。
4. 能看到输出,但输入无响应
命令:
$ docker run --rm --attach stdout -t ubuntu /bin/bash root@b47a46abdf34:/# ls
现象:可看到输出,但按键输入未被捕获。
解析:--attach stdout将容器的标准输出与本地终端关联,-t参数分配了伪终端,因此bash的提示符和命令输出能正常显示在本地终端。但未关联容器的stdin,也没有-i参数,容器无法接收本地终端的输入操作,所以按键无反应。
内容的提问来源于stack exchange,提问作者zer0uno

