为什么我的应用程序停止运行?
部署应用程序后,应用程序会运行一段时间,然后意外结束。
确定是否存在下列其中一种情况。
- 应用程序代码在完成其运行周期时包含一个出口。
- 应用程序代码包含导致应用程序意外结束的错误。
- 应用程序正在从中拉取的映像不再存在,因为您已将其删除,或者 IBM Cloud Container Registry 中的 映像保留时间策略 导致将其删除。 例如,由于入局请求,应用程序正在扩展。 但是,由于映像不再存在于 Container Registry中,因此向上扩展失败。 另一种典型情况是,如果应用程序位于调度为接收最新安全修订的工作程序节点上。 如果 Code Engine 尝试将应用程序移动到其他工作程序节点,但找不到该映像,那么移动将失败,并且应用程序将停止工作。
- 应用程序正在从中拉取的映像不再存在,因为当具有所提供标记的映像存在时,在创建应用程序修订版后将覆盖该映像。 与特定应用程序修订版关联的映像使用唯一的容器注册表摘要,此摘要用于应用程序修订版的生命周期。 如果使用与原始映像相同的标记创建映像的较新版本,那么将在容器注册表中覆盖原始映像。 但是,Code Engine 找不到此较新映像,因为较新映像的摘要与应用程序修订版的摘要不同。 无法创建应用程序的新实例,此场景会导致应用程序失败。
请尝试以下解决方案来解决您的问题。
-
Code Engine 应用程序设计为在不退出的情况下运行。 如果应用程序代码包含出口,请改为考虑 将代码作为作业运行。
-
检查可能帮助您确定原因的消息。 如果为 Code Engine设置日志记录,那么日志文件可能包含消息。 有关日志记录的更多信息,请参阅 查看日志。 应用程序必须遵循 12 因子应用程序方法。 例如,如果运行应用程序的 Code Engine 的底层结构需要更新,那么将在更新后的基础结构上创建应用程序的新实例。 当新应用程序实例标记为
Ready
时,Code Engine 会将流量路由到该实例。 然后,旧应用程序将接收到SIGTERM
消息,从而为其安全关闭留出时间。 如果未关闭,那么 Code Engine 将发送SIGKILL
消息,并且旧应用程序实例将被破坏,这可能会导致数据丢失。 -
在 Container Registry 中重新创建映像,然后部署应用程序的另一个实例。 然后,在 Container Registry 中检查 映像保留策略,以便不会删除活动修订版所使用的映像。 如果要将工具链模板用于 Code Engine,那么还可以向管道定义添加逻辑以仅在部署有效版本后删除未使用的映像版本。
-
通过 更新应用程序 为应用程序创建新修订版。 如果使用同一标记推送映像,那么必须更新应用程序以创建使用此已更新映像的新修订版。