Docker没有响应终端中的CTRL + C.

Eog*_*han 10 linux centos ipython-notebook docker

目前在Docker遇到问题; 我用它来运行一个启动时启动ipython笔记本的图像.我想对ipython笔记本本身进行一些编辑,所以我需要在启动后关闭它.

但是,在终端中按CTRL + C只输入"^ C"作为字符串.似乎没有真正的方法使用CTRL + C来实际关闭ipython笔记本实例.

任何人都有任何线索可以解决这个问题,或者知道任何解决方案吗?

ger*_*tas 23

您使用的容器映像很可能没有正确处理进程信号。如果您正在创作图像,请按照 Roland Webers 的回答建议进行更改。否则尝试使用--init.

docker run -it --init ....
Run Code Online (Sandbox Code Playgroud)

这为我修复了 Ctrl+C。来源:https : //docs.docker.com/v17.09/engine/reference/run/#specify-an-init-process


Rol*_*ber 7

问题是 Ctrl-C 向容器内的顶级进程发送信号,但该进程不一定像您期望的那样做出反应。顶级进程在容器内的 ID 为 1,这意味着它不会获得进程通常拥有的默认信号处理程序。如果顶层进程是一个 shell,那么它可以通过自己的处理程序接收信号,但不会将其转发给在 shell 内执行的命令。详细说明在这里。在这两种情况下,docker 容器的行为就好像它只是忽略了 Ctrl-C。

如果您正在构建自己的映像,解决方案是运行一个最小的 init 进程,例如tinidum -init,作为容器内的顶级进程。


bla*_*ops 5

这篇文章提议CTRL-Z作为一种变通方法,用于将进程发送到后台,然后通过其进程ID终止该进程:无法使用Ctrl-C终止 Python脚本

可能的问题:

  • 该程序捕获ctrl-c却不执行任何操作,非常不可能。

  • 有些后台进程管理不正确。只有主进程接收信号,子进程挂起。很可能发生了什么事。

建议的解决方案:

  • 查看程序文档,了解如何正确启动和停止它。ctrl-c似乎不是正确的方法。

  • 使用docker-entrypoint.sh bash脚本包装程序,该脚本会阻止容器进程并能够捕获ctrl-c。这个bash示例应该会有所帮助:https : //rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash

  • 捕获ctrl-c之后,为ipython Notebook调用正确的关闭方法。