アプリの実行が停止したのはなぜですか?

アプリをデプロイした後、アプリはしばらく実行された後、予期せずに終了します。

以下のいずれかのケースが該当するかどうかを判別します。

  1. 実行サイクルが完了すると、アプリ・コードに出口が組み込まれます。
  2. アプリ・コードに、アプリが予期せず終了する原因となっているエラーが含まれています。
  3. 削除したか、 IBM Cloud Container Registry の イメージ保存ポリシー が原因で削除されたため、アプリのプル元のイメージはもう存在しません。 例えば、着信要求のためにアプリがスケールアップしているとします。 ただし、イメージが Container Registryに存在しなくなったため、スケールアップは失敗します。 もう 1 つの典型的な状況は、最新のセキュリティー・フィックスを受け取るようにスケジュールされているワーカー・ノード上にアプリがある場合です。 Code Engine がアプリを別のワーカー・ノードに移動しようとしてもイメージが見つからない場合、移動は失敗し、アプリは動作を停止します。
  4. アプリのプル元のイメージはもう存在しません。これは、指定されたタグを持つイメージが存在している間に、アプリケーション・リビジョンの作成後に上書きされたためです。 特定のアプリケーション・リビジョンに関連付けられたイメージは、固有のコンテナー・レジストリー・ダイジェストを使用し、このダイジェストはアプリケーション・リビジョンの存続期間中使用されます。 元のイメージと同じタグを持つ新しいバージョンのイメージを作成すると、元のイメージはコンテナー・レジストリー内で上書きされます。 ただし、 Code Engine はこの新しいイメージを見つけることができません。新しいイメージには、アプリケーション・リビジョンのダイジェストとは異なるダイジェストが含まれているためです。 アプリケーションの新規インスタンスを作成できません。このシナリオでは、アプリケーションが失敗します。

以下の解決策を試してみてください。

  1. Code Engine アプリケーションは、終了せずに実行するように設計されています。 アプリ・コードに出口が含まれている場合は、代わりに ジョブとしてコードを実行する ことを検討してください。

  2. 原因の判別に役立つ可能性のあるメッセージを確認してください。 Code Engineのロギングをセットアップした場合、ログ・ファイルにメッセージが含まれていることがあります。 ロギングについて詳しくは、ログの表示を参照してください。 アプリは、 12-factor app methodologyに従う必要があります。 例えば、アプリが実行されている Code Engine の基礎となる構造を更新する必要がある場合、更新されたインフラストラクチャー上にアプリの新規インスタンスが作成されます。 新規アプリ・インスタンスに Ready のマークが付けられると、 Code Engine はそのインスタンスにトラフィックをルーティングします。 その後、古いアプリが SIGTERM メッセージを受け取り、安全にシャットダウンするための時間が確保されます。 シャットダウンしない場合、 Code Engine から SIGKILL メッセージが送信され、古いアプリ・インスタンスが破棄されるため、データが失われる可能性があります。

  3. Container Registry でイメージを再作成してから、アプリの別のインスタンスをデプロイします。 次に、アクティブなリビジョンによって使用されているイメージが削除されないように、 Container Registry の イメージ保存ポリシー を確認します。 Code Engineのツールチェーン・テンプレートを使用している場合は、作業バージョンのデプロイ後にのみイメージの未使用バージョンを削除するロジックをパイプライン定義に追加することもできます。

  4. アプリケーションを更新 して、アプリの新しいリビジョンを作成します。 同じタグを使用してイメージがプッシュされた場合は、この更新されたイメージを使用する新しいリビジョンを作成するようにアプリケーションを更新する必要があります。