tiny-runc は、非特権環境で動作する OCI Runtime Specification 準拠の低レベルコンテナランタイムを目指して開発している。tiny-runc という名前の通り、「runc」という OSS を参考に書いている。runc は、Docker や Podman の中で動いている低レベルコンテナランタイムである。実際は youki や appare45 作の socker など、多くのコンテナランタイムの実装を参考に書いている。
tiny-runc はコードをめちゃくちゃ丁寧に書いて、人々のコンテナ自作の実装のサンプルにして欲しい!みたいな気持ちがあって書いていたが、だいぶ失敗した。まず Go はシステムプログラムに向いていない。fork と exec を分離できないのは論外。例えば fork したあとの処理を親と子で 1 つずつ書けばいいところを、わざわざ子プロセス用の処理を自身のサブコマンドとして分けて、親から自分自身を呼び出す、みたいな遠回りなことをしないといけない。しかもそうすると明確にプロセスが別れてしまうので、親で利用していた構造体を子で使うみたいなことができない。せっかくオブジェクト指向的抽象化を行っているのに、プロセスを fork するたびに exec を行ってしまうと、もう一度同じ構造体を作らないといけない。
ちなみに runc ではこの問題を、「namespace の分離の部分は C 言語で記述する」という方法を取って解決している (参考)。ただこの方法は「シンプルで理解しやすいコードで簡潔に記述する」という、tiny-runc で満たしたか