我可以ubuntu成功运行容器:
ubuntu
# docker run -it -d ubuntu 3aef6e642327ce7d19c7381eb145f3ad10291f1f2393af16a6327ee78d7c60bb # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3aef6e642327 ubuntu "/bin/bash" 3 seconds ago Up 2 seconds condescending_sammet
但是执行docker attach挂起:
docker attach
# docker attach 3aef6e642327
直到我按任意键,例如Enter:
Enter
# docker attach 3aef6e642327 root@3aef6e642327:/# root@3aef6e642327:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
为什么docker attach挂?
更新 :
阅读评论后,我想我会得到答案:
先决条件:
“ docker attach”重用相同的tty,而不打开新的tty。
(1)执行docker run无守护程序模式:
docker run
# docker run -it ubuntu root@eb3c9d86d7a2:/#
一切正常,然后运行ls命令:
ls
root@eb3c9d86d7a2:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@eb3c9d86d7a2:/#
(2)docker run在守护程序模式下运行:
# docker run -it -d ubuntu 91262536f7c9a3060641448120bda7af5ca812b0beb8f3c9fe72811a61db07fc
实际上, 以下内容应该已经从正在运行的容器输出到stdout:
root@91262536f7c9:/#
因此执行docker attach似乎挂起,但实际上它正在等待您的输入:
# docker attach 91262536f7c9 ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@91262536f7c9:/#
它并没有真正 挂起 。正如您在下面的注释中看到的那样(您正在/bin/bash以命令“ ” 运行),这似乎是附加时的预期行为。
/bin/bash
据我了解,您附加到正在运行的shell上,而只是stdin / stdout / stderr(取决于与run命令一起传递的选项)将仅向您显示 _ 从那一刻起 进出 _ 的一切 。(希望您有更深入的知识的人可以在更高层次上对此进行解释)。
正如我在对您的问题的评论中所写的那样,有一些人在docker github存储库上打开了一个描述类似行为的问题:
既然您提到了shell,我假设您已经有一个shell运行了。attach不会启动新进程,因此连接到正在运行的进程的in / out / err流的预期行为是什么?我没有考虑这个。当然,这是连接到运行中的shell的预期行为,但这是否合乎需要? 能否在docker Attach上刷新stdout / stderr从而强制打印shell提示,或者比这还要复杂?这是我个人将“附加”到已经运行的shell上时的期望。 如有必要,请随时结束此问题,我只是觉得有必要对此进行记录并获得一些反馈。
既然您提到了shell,我假设您已经有一个shell运行了。attach不会启动新进程,因此连接到正在运行的进程的in / out / err流的预期行为是什么?我没有考虑这个。当然,这是连接到运行中的shell的预期行为,但这是否合乎需要?
能否在docker Attach上刷新stdout / stderr从而强制打印shell提示,或者比这还要复杂?这是我个人将“附加”到已经运行的shell上时的期望。
如有必要,请随时结束此问题,我只是觉得有必要对此进行记录并获得一些反馈。
如果不是enter开始输入命令,而是看不到 多余的 空提示行。如果你要跑步
enter
$ docker exec -it ubuntu <container-ID-or-name> bash
<container-ID-or-name>运行后容器的ID或名称在哪里docker run -it -d ubuntu(因此问题中为3aef6e642327或condescending_sammet),它将运行一个 新 命令,因此不会出现附加到现有命令的“ stdout问题”。
<container-ID-or-name>
docker run -it -d ubuntu
如果您Dockerfile的目录中包含:
Dockerfile
FROM ubuntu:latest ADD ./script.sh /timescript.sh RUN chmod +x /timescript.sh CMD ["/timescript.sh"]
并script.sh在同一目录中包含一个简单的bash脚本,其中包括:
script.sh
#!/bin/bash #trap ctrl-c and exit, couldn't get out #of the docker container once attached trap ctrl_c INT function ctrl_c() { exit } while true; do time=$(date +%N) echo $time; sleep 1; done
然后构建(在此示例中,与Dockerfile和script.sh位于同一目录中)并使用
$ docker build -t nan-xiao/time-test . ..stuff happening... $ docker run -itd --name time-test nan-xiao/time-test
最后 attach
attach
$ docker attach time-test
您最终将附着在容器上,并每秒打印一次时间。(CTRL-C退出)
或者Dockerfile,例如,如果您包含以下内容:
FROM ubuntu:latest RUN apt-get -y install irssi ENTRYPOINT ["irssi"]
然后在同一目录中运行:
$ docker build -t nan-xiao/irssi-test .
然后运行它:
$ docker run -itd --name irssi-test nan-xiao/irssi-test
最后
$ docker attach irssi-test
您最终将irssi没有一个特定的行为而正在运行的窗口中。当然,您可以替代irrsi其他程序。
irssi
irrsi