如何优雅地分离无限睡眠泊坞窗以及为啥

Posted

技术标签:

【中文标题】如何优雅地分离无限睡眠泊坞窗以及为啥【英文标题】:how to detach a infinite sleep docker gracefully and why如何优雅地分离无限睡眠泊坞窗以及为什么 【发布时间】:2019-10-14 14:54:29 【问题描述】:

1) 我运行以下命令来启动一个容器:

docker run -d ubuntu /bin/bash -c 'while true; do echo hello world; sleep 1; done;'

2) 我使用以下命令附加到它。

docker attach xxxx

3) 我无法使用ctrl +cctrl +p ctrl+q 序列将其分离。

我想知道如何退出它以及为什么ctrl + c 不起作用。谢谢。

【问题讨论】:

【参考方案1】:

bash 脚本是容器中的主进程,它有PID 1。正如docs 中所述,PID 1 的进程与其他进程的处理方式不同:

在容器内以 PID 1 运行的进程会被特殊处理 Linux:它使用默认操作忽略任何信号。所以,过程 不会在 SIGINT 或 SIGTERM 上终止,除非它被编码这样做。

这意味着脚本应该捕获信号并对其进行处理。让它退出声明一个trap

docker run -d ubuntu /bin/bash -c 'trap exit INT TERM; while true; do echo hello world; sleep 1; done;'

请记住,在前台进程终止之前,bash 不会处理任何信号(在本例中为 sleep)。因此会有延迟,具体取决于睡眠间隔和您按下CTRL+C 的时间。 要立即退出,sleep 应该是可中断的(参见sleep, wait and Ctrl+C propagation):

docker run -d ubuntu /bin/bash -c 'trap exit INT TERM; while true; do echo hello world; sleep 1 & wait; done;'

容器使用-d 标志运行。除非您使用 -it 运行它,否则您无法分离。

如果容器使用 -i 和 -t 运行,您可以从 容器并使用 CTRL-p CTRL-q 键序列使其运行

.

【讨论】:

以上是关于如何优雅地分离无限睡眠泊坞窗以及为啥的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Beanstalk 泊坞窗错误

sh 标记并推送泊坞窗图像到泊坞窗集线器

为啥C没有像javascript中的setTimeout这样的非阻塞睡眠功能

使用多阶段泊坞窗文件输出多个图像

sh [下载并设置HDF 3.0泊坞窗容器]使用此脚本下载并设置HDF泊坞窗容器#hdf #docker #setup#hdf30

同步泊坞窗使用本地注册表托管图像