【Amazon ECS】Amazon Linux 2023のコンテナを終了コード0で終わらせずに立ち上げる方法

2024.01.24

こんにちはカスタマーソリューション部のこーへいです!

今回はAmazon Linux 2023のイメージを利用して、コンテナを終了させずに起動し続ける方法を紹介します。

追記(2024/1/31)

より適切な方法を紹介した記事を執筆しました。

こちらの記事の方法はDockerfileに記述されたエントリポイント(コマンド)を上書きしてしまう問題があり、より汎用的に使える上記記事の擬似ターミナル(pseudoTerminal)を有効化方法を推奨しています。

今回の問題

今回、学習のためにECS Execを利用してコンテナにログインしようとしたのですが、Amazon Linux 2023のイメージを利用してECSで立ち上げても、終了コード0の状態でタスクが終了してしまいました(使用しているイメージURIはpublic.ecr.aws/amazonlinux/amazonlinux:latestです)。

Amazon ECS タスクが停止するのはなぜですか?を確認すると正常にプロセスを終了した結果のようですが(終了コード0なので想定通り)、起動後すぐに落ちてしまうのではECS Execもできません。

0 – Entrypoint、success、または CMD が実行を完了しているため、コンテナが停止しています。

そこで何かしらのプロセスを起動し、コンテナが落ちないようにする方法を調査しました。

前提

ECS Execを使用するための方法や前提はこちらの記事をご参照ください。

結論と手順の紹介

ECSタスク定義にてエントリポイント(もしくはコマンド)に何もしないプロセスを実行するコマンドを設定しましょう。

※Docker fileに記述する方法もありますが、今回はパブリックなイメージを直接取得しているので、ECSタスク定義で指定する方法を紹介します。

タスク定義を更新する

永遠に終了せず何もしないDockerコンテナを立ち上げる方法を参考に、tail -F /dev/nullをエントリポイントに追加することにします。

ちなみに少し話題がそれますが、エントリポイントとコマンドの違いについては【AWS ECS】Fargateの「コマンドの上書き」の記事がわかりやすかったので、説明はこちらの記事に委託します。簡単に言うとコマンドとエントリポイント両方を指定した場合、コマンドはエントリポイントのパラメータとして扱われます。

こちらがECSタスク定義に設定した状態です。

タスクを更新しログインする

では、タスク定義を更新した状態でタスクを起動してみましょう。

今度は終了せずに起動し続けています、続けてECS Execできるか試してみます。

無事アクセスできました!

おまけ

プロセスを確認しよう

せっかくなので終了コード0が出ている原因を探るためにプロセスがどうなっているのか気になったので確認しました。

コンテナ内でpsコマンドを実行するため、ECS Execでコンテナにログイン後にインストールします(Amazon Linux 2023の場合)。

dnf update
dnf install procps

その後、psコマンドでコンテナ内で動いているプロセスを確認します。

ps auxf

psコマンド自体のプロセスは、ECS Execのプロセス配下で実行されていることが分かりました。

また独立して先ほどエントリポイントで指定したtail -F /dev/nullプロセスがあり、このプロセスが動き続けているためコンテナが落ちないというわけですね。

先ほどは何もプロセスがないので終了コード0で終了したということです。

まとめ

検証の際に調べたことを記事にしました。参考になれば幸いです。

他にもsleep infinityコマンドも対応していそうなので、お好みで何もしないコマンドを設定しましょう。