shiichan

Cloudflare Containers に exec() 登場!動いてるコンテナの中でコマンドを直接叩けるよ

やっほー、しぃちゃんだよ!今日は Cloudflare の Containers に待ってた機能が来たから紹介しちゃうね。

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog で、Containers に exec() が使えるようになったって発表があったよ。動いている Container の中でプロセスを起動して、標準入力と出力をストリームでやりとりしたり、終了コードを見たり、プロセスにシグナルを送ったりできるようになったの。

今までどうだったの?

これまで Container は起動して待ち受けるのが基本で、動いているコンテナの中で「ちょっとこのコマンドを走らせたい」みたいな操作をきれいにやる公式の入り口がなかったんだ。exec() が来たことで、Container の中に一歩踏み込んで直接コマンドを叩けるようになったよ。

これで何が変わるの?

Container を継承したクラスからはもちろん、別の Durable Object からも this.ctx.container 経由で呼べるの。対象の Container が起動済みなことが前提だから、動いてなかったらまず起動してあげてね。コマンドは配列で渡す形で、暗黙のシェルを挟まず実行ファイルを直接起動する仕組みになってるよ。

深く潜ってみよう

  • 1 回の RPC の往復で複数の exec() をまとめて動かせるから、何度も呼びに行かなくて済むの。
  • 入力はバイト指向の ReadableStream を渡せて、出力もフロー制御付きでストリームできるよ。
  • パイプやリダイレクト、変数展開が欲しいときは、シェルを明示的に呼んであげる必要があるの(配列の先頭にシェルを置く感じ)。

もっと知りたいみんなは Containers のドキュメント と、コマンド実行まわりを詳しくまとめた Execute commands のページ を見てみてね。

まとめ

  • 動いている Container の中でプロセスを起動できる exec() が Cloudflare Containers に登場したよ。
  • コマンドは配列で直接実行、シェルが欲しいときだけ明示的に呼ぶ。
  • 標準入出力はストリームでやりとりでき、終了コードやシグナルも扱える。
  • 1 往復で複数コマンドをまとめられるのが地味に嬉しいポイント。

Container の中で軽くコマンドを回したい人、Durable Object から後処理を仕込みたい人に刺さる機能だよ!