為何我的應用程式停止執行?

部署應用程式之後,應用程式會執行一段時間,然後非預期地結束。

判斷下列其中一個觀察值是否為 true。

  1. 您的應用程式碼包括完成其執行週期的結束程式。
  2. 您的應用程式碼包含導致應用程式非預期地結束的錯誤。
  3. 應用程式從中取回的映像檔已不再存在,因為您已刪除它,或 IBM Cloud Container Registry 中的 映像檔保留原則 導致刪除它。 例如,您的應用程式因為送入的要求而擴增。 不過,擴增失敗,因為映像檔不再存在於 Container Registry中。 另一個典型狀況是如果您的應用程式位於排定要接收最新安全修正程式的工作者節點上。 如果 Code Engine 嘗試將應用程式移至不同的工作者節點,但找不到映像檔,則移動會失敗,且應用程式會停止運作。
  4. 應用程式從中取回的映像檔已不再存在,因為當具有所提供標籤的映像檔存在時,在建立應用程式修訂之後已改寫該映像檔。 與特定應用程式修訂相關聯的映像檔會使用唯一的儲存器登錄摘要,且此摘要用於應用程式修訂的生命週期。 如果您建立與原始映像檔具有相同標籤的較新映像檔版本,則會改寫儲存器登錄中的原始映像檔。 不過,Code Engine 找不到這個較新的映像檔,因為較新的映像檔具有不同於應用程式修訂摘要的摘要。 無法建立應用程式的新實例,而且此實務範例會導致應用程式失敗。

請嘗試下列解決方案來解決問題。

  1. Code Engine 應用程式設計為執行而不結束。 如果您的應用程式碼包括結束程式,請考量改為 將您的程式碼作為工作執行

  2. 請檢查可協助您判斷原因的訊息。 如果您設定 Code Engine的記載,則日誌檔可能包含訊息。 如需記載的相關資訊,請參閱 檢視日誌。 您的應用程式必須遵循 12 因子應用程式方法。 例如,如果應用程式執行所在之 Code Engine 的基礎結構需要更新,則會在更新的基礎架構上建立應用程式的新實例。 當新的應用程式實例標示為 Ready 時,Code Engine 會將資料流量遞送至其中。 然後您的舊應用程式會收到 SIGTERM 訊息,讓它有時間安全關閉。 如果它未關閉,則 Code Engine 會傳送 SIGKILL 訊息,且您的舊應用程式實例已毀損,這可能會導致資料遺失。

  3. 在 Container Registry 中重建映像檔,然後部署應用程式的另一個實例。 然後,檢查 Container Registry 中的 映像檔保留原則,以便不會刪除作用中修訂所使用的映像檔。 如果您使用 Code Engine的工具鏈範本,則也可以將邏輯新增至管線定義,以僅在部署工作版本之後刪除映像檔的未用版本。

  4. 透過 更新應用程式 來建立應用程式的新修訂。 如果使用相同標籤推送映像檔,則您必須更新應用程式,以建立使用此更新映像檔的新修訂。