当前位置: 首页 > 面试题库 >

为什么“ docker Attach”挂起?

岳嘉良
2023-03-14
问题内容

我可以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:/#

一切正常,然后运行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以命令“ ” 运行),这似乎是附加时的预期行为。

据我了解,您附加到正在运行的shell上,而只是stdin / stdout / stderr(取决于与run命令一起传递的选项)将仅向您显示 _ 从那一刻起 进出 _ 的一切 。(希望您有更深入的知识的人可以在更高层次上对此进行解释)。

正如我在对您的问题的评论中所写的那样,有一些人在docker github存储库上打开了一个描述类似行为的问题:

  • docker attach [container]挂起,需要输入#8521
  • docker attach在附加到容器时挂起设置终端状态

既然您提到了shell,我假设您已经有一个shell运行了。attach不会启动新进程,因此连接到正在运行的进程的in /​​ out /
err流的预期行为是什么?我没有考虑这个。当然,这是连接到运行中的shell的预期行为,但这是否合乎需要?

能否在docker Attach上刷新stdout /
stderr从而强制打印shell提示,或者比这还要复杂?这是我个人将“附加”到已经运行的shell上时的期望。

如有必要,请随时结束此问题,我只是觉得有必要对此进行记录并获得一些反馈。

  • 从拍摄评论这个GitHub的问题。您可以在此问题的评论中找到更多见解。

如果不是enter开始输入命令,而是看不到 多余的 空提示行。如果你要跑步

$ docker exec -it ubuntu <container-ID-or-name> bash

<container-ID-or-name>运行后容器的ID或名称在哪里docker run -it -d ubuntu(因此问题中为3aef6e642327或condescending_sammet),它将运行一个 命令,因此不会出现附加到现有命令的“
stdout问题”。

如果您Dockerfile的目录中包含:

FROM ubuntu:latest
ADD ./script.sh /timescript.sh 
RUN chmod +x /timescript.sh
CMD ["/timescript.sh"]

script.sh在同一目录中包含一个简单的bash脚本,其中包括:

#!/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

$ docker attach time-test

您最终将附着在容器上,并每秒打印一次时间。(CTRL-C退出)

例子2

或者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其他程序。



 类似资料:
  • 问题内容: 我正在尝试与大学的MySQL数据库建立连接,但该连接已挂起。 此调用:打印(在我最终杀死它之后): 我刚刚从下载的MySQL连接器/ J 这里。我不确定这是否是问题的一部分。我非常准确地遵循了指示。 我也可以像这样在命令行上连接到mysql: 可能的问题: 我写的Java代码 我如何安装MySQL Connector / J 某种网络问题阻止了连接 问题: 我应该怎么解决这个问题?为什

  • 问题内容: 由于ES6类仅仅是 avaScript现有的基于原型的继承 的 _语法[[1]],因此(IMO)可以合理地定义它: 但是以下操作无效: 为什么不悬挂ES6类? 问题答案: 为什么不悬挂ES6类? 其实他们 _都_悬挂(变量绑定在整个范围内都有效),就像和是他们只未初始化。 提升其定义很有意义 不。在定义类之前使用类绝不是一个好主意。考虑例子 比较一下 如您所料,这会引发错误。这是静态属

  • 我正在尝试使用Firebase身份验证实现Apple登录。我正在遵循Firebase/快速入门-android示例。 我的登录片段会覆盖,以检查任何挂起的结果: 以及启动登录流程的按钮: viewModel从存储库调用以下方法: 官方手册规定: 使用此方法登录会将您的活动置于后台,这意味着系统可以在登录流程中回收活动。 所以我开始测试挂起的结果,方法是在Android Studio中终止应用程序,

  • 我已经写了一个玩具应用程序来尝试通过sqlx使用Postgresql。我有一个大容量插入器 作为准备好的陈述的内容 然后,我将继续向正在创建的体量插入添加行。 然后最后执行准备好的语句 这以前工作得很好,但是现在我又回到了它,试着执行这个代码,它挂在 我是否在代码中遗漏了什么,或者这一切都与数据库引擎有关,没有响应。 这是我的完整代码。 如果有帮助的话,我也可以包括contacts.json文件的

  • 问题内容: 想要改善此职位? 提供有关此问题的详细答案,包括引文和为什么您的答案正确的解释。答案不够详细的答案可能会被编辑或删除。 我在Arch Linux,i7-5930k 6核心CPU和64GB DDR4 RAM上运行,并且正在使用IntelliJ IDEA 14。 几天前,IDEA对我来说还算不错,但是有一天,突然间,它在“索引”阶段打开项目后就开始挂起。我没有更新IDEA,并且我的项目没有

  • 我正在完成下面的Clojure教程。我刚刚安装了Emacs和Leiningen。如果单独调用,两者都可以工作。但是,当我试图调用时,如本教程所述: 使用Emacs打开文件clojure noob/src/clojure_noob/core。clj,您在第1章中创建的。接下来,使用M-x苹果酒插孔。这将启动REPL并创建一个新的缓冲区,您可以在其中与之交互。 在最后一条消息后将永远挂起: 我做错了什