首页 > 解决方案 > 通过 docker 部署时无法在 Heroku 应用程序中处理 SIGTERM

问题描述

我正在迁移现有的 Heroku 应用程序以使用 Docker 而不是 git 进行部署。该应用程序正在使用自定义 SIGTERM 处理程序,该处理程序不会在测功机终止时被调用。

SIGTERM 处理程序在通过 git 部署时工作正常,但在通过 Heroku 部署时无法运行。

这是我的 Dockerfile 中的相应行:

RUN exec python3 main.py

(我已经尝试过不使用exec,但这似乎并不重要。)

测功机立即停止,状态码为 143。没有信号处理程序被触发的迹象。

这个问题与这个问题类似我有一个奇怪的 PID 1 进程,它有不同的 UID,这意味着我无法控制它。它可能在不让应用程序知道的情况下处理 SIGTERM 本身。

编辑:主进程的命令行是sh -l -c 'sh -c python3\ main.py',或者sh -l -c 'python3 main.py'如果使用ENTRYPOINT而不是CMD.

标签: dockerherokusigterm

解决方案


你应该使用:

ENTRYPOINT exec python3 main.py作为 Dockerfile 的最后一行

然后 python 进程将具有 pid 1 并接收 SIGTERM。


推荐阅读