应用程序的PID 1在bash循环中自动重新启动

时间:2018-04-17 13:22:44

标签: linux docker kubernetes pid

鉴于是微服务,经过一段时间后需要自行退出。这不是错误条件,而是(在这种情况下)正常行为。 退出后应自动重启。

所以目前我有一个脚本run_app.sh

#!/usr/bin/env bash
while true; do ./app ; done

Dockerfile(继承FROM ubuntu:16.04)中我按照这样运行:

CMD ["./run_app.sh"]

它“有效”,但由于app没有PID 1,因此它不接收来自Kubernetes的SIGTERM等,这是在滚动更新等期间正常关闭所需的。

while true; do exec ./app ; done中使用run_app.sh无法解决问题,因为当app完成并且未执行重新启动时,循环不再存在。

如何在容器内自动重启应用程序而不必在每次退出时重新启动容器/容器,但仍具有PID 1的优势?

1 个答案:

答案 0 :(得分:1)

好吧,你的循环重启你的应用,所以这不是你的问题。您的问题是发送到docker容器的信号不会传播到容器中。 Docker不是(AFAIK)不应该像这样使用,所以它不会将信号传播到它的应用程序。

您有两种处理方法:

  1. 您可以教信号发送者(Kubernetes或其他),而不是向Docker容器发送信号做更精细的事情,以便将信息传递到容器内的应用程序。我想这并不容易(如果可能的话)。

  2. 您可以将循环shell脚本迁移到容器之外,让Kubernetes(或其他)运行此脚本。 循环中,您可以在里面启动Docker容器。在这种情况下,您需要在外部循环shell脚本(help trap)中捕获SIGTERM,并将SIGTERM直接发送到Docker容器或发送到Docker容器中的应用程序(使用Docker exec或类似)。