【问题标题】:Can't handle SIGTERM in Heroku app when deploying via docker通过 docker 部署时无法在 Heroku 应用程序中处理 SIGTERM
【发布时间】:2020-02-24 04:53:11
【问题描述】:

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

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

这是我的 Dockerfile 中的相应行:

RUN exec python3 main.py

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

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

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

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

【问题讨论】:

  • RUN exec python3 main.py 是您的Dockerfile 的最后一行吗?
  • 是的,这是最后一行。
  • 很难协助处理“奇怪的 PID 1”。请显示在您拥有的容器内运行的进程列表。请注意,我们看不到您的屏幕。

标签: docker heroku sigterm


【解决方案1】:

你应该使用:

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

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

【讨论】:

  • 不幸的是,这不起作用。 ENTRYPOINT python3 main.py 根本不启动,而 ENTRYPOINT /app/main.py 启动(在 main.py 中带有 shebang),但仍然无法处理 SIGTERM。
  • 请在容器启动后分享ps -ef的完整dockerfile和输出
  • 我终于设法通过用我的入口点替换 /bin/sh 来处理 SIGTERM。即使我使用ENTRYPOINTsh 进程仍然存在(他们可能这样做是为了使用配置变量填充环境)。我的容器中没有ps
  • 是的,我已经编辑了我的答案。 exec 应该使 python 进程具有 pid 1 而不是 /bin/sh。而且shebang应该/bin/python3我猜
  • 不幸的是,这也不起作用。如果我将execENTRYPOINT 一起使用,测功机将无法启动。
猜你喜欢
  • 2023-01-22
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 2016-06-23
  • 2013-08-22
  • 2018-04-11
  • 1970-01-01
相关资源
最近更新 更多