鉴于是微服务,经过一段时间后需要自行退出。这不是错误条件,而是(在这种情况下)正常行为。 退出后应自动重启。
所以目前我有一个脚本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的优势?
答案 0 :(得分:1)
好吧,你的循环会重启你的应用,所以这不是你的问题。您的问题是发送到docker容器的信号不会传播到容器中。 Docker不是(AFAIK)不应该像这样使用,所以它不会将信号传播到它的应用程序。
您有两种处理方法:
您可以教信号发送者(Kubernetes或其他),而不是向Docker容器发送信号做更精细的事情,以便将信息传递到容器内的应用程序。我想这并不容易(如果可能的话)。
您可以将循环shell脚本迁移到容器之外,让Kubernetes(或其他)运行此脚本。 在循环中,您可以在里面启动Docker容器。在这种情况下,您需要在外部循环shell脚本(help trap
)中捕获SIGTERM,并将SIGTERM直接发送到Docker容器或发送到Docker容器中的应用程序(使用Docker exec
或类似)。