【问题标题】:Why does trying to kill a process in Docker container take me out of it?为什么试图杀死 Docker 容器中的进程会让我脱离它?
【发布时间】:2017-08-16 23:39:15
【问题描述】:

我的 macOS 上有一个 v6.10.0 节点服务器,它自动从 Dockerfile 中的 CMD 启动。通常在我的本地开发非容器化环境中,我将使用 CTRL+C 来终止服务器。无法(或不知道如何)在容器中执行此操作,我求助于ps aux | grep node 尝试手动终止进程。所以,我得到这样的东西:

myapp [master] :> kubectl exec -it web-3127363242-xb50k bash
root@web-3127363242-xb50k:/usr/src/app# ps aux | grep node
root        15  0.4  0.9 883000 35804 ?        Sl   05:49   0:00 node /usr/src/app/node_modules/.bin/concurrent --kill-others npm run start-prod npm run start-prod-api
root        43  0.1  0.6 743636 25240 ?        Sl   05:49   0:00 node /usr/src/app/node_modules/.bin/better-npm-run start-prod
root        44  0.1  0.6 743636 25140 ?        Sl   05:49   0:00 node /usr/src/app/node_modules/.bin/better-npm-run start-prod-api
root        55  0.0  0.0   4356   740 ?        S    05:49   0:00 sh -c node ./bin/server.js
root        56  0.0  0.0   4356   820 ?        S    05:49   0:00 sh -c node ./bin/api.js
root        57 18.6  4.9 1018088 189416 ?      Sl   05:49   0:08 node ./bin/server.js
root        58 13.9  5.2 1343296 197576 ?      Sl   05:49   0:06 node ./bin/api.js
root        77  0.0  0.0  11128  1024 ?        S+   05:50   0:00 grep node

当我试图杀死他们中的一个时

kill -9 15

我从容器的外壳中取出并回到我的计算机外壳。当我再次进入容器时,我看到该进程仍然存在,具有相同的进程 ID。此示例使用 Kubernetes pod,但我相信使用 docker exec 命令进入 Docker 容器会得到相同的结果。

【问题讨论】:

  • 我认为你 kill 命令间接导致容器重启。试试看kubectl describe pod web-.....

标签: linux bash shell docker kubernetes


【解决方案1】:

每个 docker 容器都有一个 ENTRYPOINT,可以在 dockerfile 中设置,使用 ENTRYPOINTCMD 声明,或者在运行命令 @987654324 中指定@。当 ENTRYPOINT 进程被杀死时,我认为容器也会被杀死。据我了解,docker exec 有点像将命令“附加”到容器上。但如果 ENTRYPOINT 已关闭,则没有可附加的容器。

据我所知,Kubernetes 会在失败后重启一个容器。这可能是您看到该过程已备份的原因。我还没有真正使用过 Kubernetes,但我会尝试使用复制为 scaled 的方式来终止您的进程。

【讨论】:

  • 就我而言,我想从容器内部终止入口点进程并重新启动它。将ENTRYPOINT 切换到CMD 允许这样做,因为bash 在使用/bin/bash 运行容器时成为“容器进程”。
【解决方案2】:

容器将您所需的应用程序隔离为命名空间内的 pid 1。如果您没有定义入口点,则所需的应用程序是您的入口点或 cmd。如果终止进程导致 pid 1 退出,则容器将立即停止(类似于在 linux 主机上终止 pid 1)并终止所有其他 pid。如果此容器有重启策略,它将被重启,并且进程将获得与上次运行时相同的 pid(所有其他条件都相同,它通常在容器内)。

为了防止容器停止,您需要调整入口点以保持在子进程被杀死的情况下。在这方面,让容器退出通常是通过返回干净状态来处理意外错误的首选行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多