【问题标题】:Docker not responding to CTRL+C in terminalDocker 没有响应终端中的 CTRL+C
【发布时间】:2015-09-29 18:25:16
【问题描述】:

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

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

有没有人知道什么会导致这种情况,或者知道任何解决方案?

【问题讨论】:

    标签: linux centos docker ipython-notebook


    【解决方案1】:

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

    docker run -it --init ....
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        这篇文章建议使用 CTRL-Z 作为将进程发送到后台然后通过进程 ID 终止进程的解决方法: Cannot kill Python script with Ctrl-C

        可能的问题:

        • 程序捕捉到 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 的正确关闭方法。

        【讨论】:

          【解决方案4】:

          @maybeg 的回答已经很好地解释了为什么会发生这种情况。

          关于停止无响应的容器,另一种解决方案是在另一个终端中简单地发出docker stop <container-id>。与 CTRL-C 不同,docker stop 不发送 SIGINT 而是发送 SIGTERM 信号,进程可能会对此做出不同的反应。

          用法:docker stop [OPTIONS] CONTAINER [CONTAINER...]

          通过发送 SIGTERM 然后在宽限期后发送 SIGKILL 来停止正在运行的容器

          如果失败,请使用docker kill <container-id>,它会立即发送 SIGKILL。

          【讨论】:

          • 您是否有关于如何在 docker 中包装需要正确关闭例程的进程的最佳实践解决方案或入口点脚本?
          【解决方案5】:

          来自 Docker 留言板上的 this post

          打开一个新的shell并执行

          $ docker ps # get the id of the running container
          $ docker stop <container> # kill it (gracefully)
          

          这对我来说效果很好。 CTRL-Z、CTRL-\ 等只是作为字符串出现,但这会杀死 Docker 容器并将选项卡返回到终端输入。

          【讨论】:

            猜你喜欢
            • 2021-12-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-19
            • 1970-01-01
            • 1970-01-01
            • 2016-11-10
            相关资源
            最近更新 更多