我可以成功运行 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 3aef6e642327
直到我按下任意键,例如 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 -it ubuntu
root@eb3c9d86d7a2:/#
一切OK,然后运行 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
实际上, 以下内容应该已经从正在运行的容器输出到标准输出:
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:/#
原文由 Nan Xiao 发布,翻译遵循 CC BY-SA 4.0 许可协议
它并没有真正 _挂起_。正如您在下面的评论中看到的(您正在运行“
/bin/bash
”作为命令),附加时似乎是预期的行为。据我了解,您附加到正在运行的 shell 中,而 stdin/stdout/stderr(取决于您与运行命令一起传递的选项)只会向您显示 从那一刻起 进入/退出的任何内容。 (希望有更深入知识的人可以在更高层次上解释这一点)。
正如我在对您的问题的评论中所写的那样,有几个人在 docker github repo 上打开了一个问题,描述了类似的行为:
如果不是
enter
您将开始输入命令,您将不会看到 额外的 空提示行。如果你要跑其中
<container-ID-or-name>
是运行后容器的 ID 或名称docker run -it -d ubuntu
(所以 3aef6e642327 或 condescending_sammet 在你的问题中)它将运行一个 新 命令,因此没有这个“标准输出问题”附加到现有的。例子
如果您在包含以下内容的目录中有
Dockerfile
:并在同一目录中有一个简单的 bash 脚本
script.sh
包含:然后构建(在此示例中与 Dockerfile 和 script.sh 位于同一目录中)并运行它
最后
attach
您最终将连接到一个容器,每秒打印出时间。 (CTRL-C 退出)
示例 2
或者,如果您有
Dockerfile
包含例如以下内容:然后在同一目录下运行:
然后运行它:
最后
如果没有这种特殊行为,您最终会进入一个正在运行的
irssi
窗口。当然你可以用irrsi
代替另一个程序。