永遠に終了せず何もしないDockerコンテナを立ち上げる方法

2023-03-27Docker

はじめに

Docker コンテナを運用する際、仮想化された環境内で動作するコンテナプロセスを最小限に抑えることで無駄なサーバーリソースの消費を抑え、コストダウンにつなげることができます。

しかし、場合によっては何もしないコンテナを起動しておき、そのままにしたいというケースがあります。
具体的には AWS ECS 環境や CKE 、Kubernetes 環境でコンテナを立ち上げ、アタッチ ( 接続 ) して運用作業を行いたい、といった場合です。
そんなときに役立つのが「永遠に終了せず何もしない」コンテナです。

毎回起動コマンドをどうしたらよいか悩むので、選択肢を整理するためにまとめてみました。

検証環境

$ uname -moi
arm64 unknown Darwin

$ bash -version | head -n 1
GNU bash, バージョン 5.2.15(1)-release (aarch64-apple-darwin22.1.0)

$ docker --version
Docker version 20.10.21, build baeda1f

どんなときに「永遠に終了せず何もしない」コンテナが必要?

冒頭でも紹介したように、AWS ECS 環境や CKE 、Kubernetes 環境でコンテナを立ち上げ、アタッチ ( 接続 ) して運用作業を行うときに役立つのが「永遠に終了せず何もしない」コンテナです。

例えば、コンテナを立ち上げてアタッチしてから、コンテナ内で作業するときです。

永遠に終了せず何もしないコンテナを立ち上げる方法

以下の方法で「永遠に終了せず何もしない」コンテナを立ち上げることができます。

  1. "tail -F /dev/null" を使う
  2. "sleep infinity" を使う
  3. "while true; do sleep 1; done" を使う

以下でそれぞれの方法を詳しく見ていきます。

方法 1 : "tail -F /dev/null" を使う

やり方

tail -F /dev/null を実行することで、何もしていないプロセスが起動します。

$ docker run -d alpine tail -F /dev/null

Dockerfile に記述する場合は以下のように記述します。 ( FROM 句の部分はお好きなベースイメージを指定してください )

FROM alpine

ENTRYPOINT ["tail", "-F", "/dev/null"]

なぜ "tail -f /dev/null" ではないの?

tail コマンドの -f オプションはファイルが削除され再作成されると、ファイルポインタが失われてしまいます。
これに対して -F オプションは、ログファイルが削除されたり移動されたりしたとしても、再び同じファイル名でファイルが用意されればフォローを継続します。

/dev/null ファイルは Linux において非常に特殊なファイルで常に存在し続けると考えられますが、極稀にファイルがリマウントされるという事象があるそうです。
これに対処するため "-F" オプションを使っています。

tail -F コマンドについて詳しく知りたい方は以下のエントリを参照ください。

方法 2 : "sleep infinity" を使う

やり方

sleep infinity を実行することで同じく「何もしない」プロセスが起動します。

$ docker run -d alpine sleep infinity

Dockerfile に記述する場合は以下のように記述します。 ( FROM 句の部分はお好きなベースイメージを指定してください )

FROM alpine

ENTRYPOINT ["sleep", "infinity"]

注意点 : "infinity" を指定できる "sleep" コマンドのバージョンについて

GNU 系の sleep コマンドでは infinity が使えますが、 実施次第で infinity 引数を使えない場合があります。
今回は Docker の Alpine イメージで試しましたが使用できました。

方法 3 : "sleep" と ループを組み合わせる

sleep とループを組み合わせれば、永遠に終了せず何もしないプロセスを立ち上げることができます。

$ docker run -d alpine sh -c "while true; do sleep 1; done"

sleep 1 は特に意味があるわけではないので、 sleep 3600 でも sleep 86400 でも良いでしょう。

ひとこと

Docker コンテナには「永遠に終了せず何もしない」プロセスを起動する方法がいくつかあります。
上記の方法を使って、必要な状況に応じたコンテナを起動しましょう。

2023-03-27Docker