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

PID 1 for application automatically restarted in bash loop

给定的是一个微服务,一段时间后需要自行退出。这不是错误情况,而是(在那种情况下)正常行为。 退出后应该会自动重启。

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

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

并且在Dockerfile(继承FROM ubuntu:16.04)我运行是这样的:

CMD ["./run_app.sh"]

它 "works" 但由于 app 没有 PID 1,它不会收到来自 Kubernetes 的 SIGTERM 等,这是在滚动更新等期间正常关闭所必需的

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

如何在容器内自动重启应用程序,而无需每次退出都重新启动容器/pod,但仍然具有 PID 1 的优点?

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

您有两种处理方式:

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

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