永遠に終了せず何もしないDockerコンテナを立ち上げる方法
はじめに
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 環境でコンテナを立ち上げ、アタッチ ( 接続 ) して運用作業を行うときに役立つのが「永遠に終了せず何もしない」コンテナです。
例えば、コンテナを立ち上げてアタッチしてから、コンテナ内で作業するときです。
永遠に終了せず何もしないコンテナを立ち上げる方法
以下の方法で「永遠に終了せず何もしない」コンテナを立ち上げることができます。
- "tail -F /dev/null" を使う
- "sleep infinity" を使う
- "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 コンテナには「永遠に終了せず何もしない」プロセスを起動する方法がいくつかあります。
上記の方法を使って、必要な状況に応じたコンテナを起動しましょう。
ディスカッション
コメント一覧
まだ、コメントがありません