PID 1 はあなたのもの
エージェントはバックグラウンドの子プロセスです。Docker はあなたのプロセスに直接シグナルを送り、その終了コードがコンテナの終了コードになります。
FROM your-image # unchanged
COPY --from=markolofsen/cmdop:latest /cmdop /usr/local/bin/cmdop
ENTRYPOINT ["cmdop", "sidecar", "--"]
CMD ["your-app", "--your", "flags"] # unchangedベースイメージもコマンドもそのままです。
コントロールプレーンはどこか別の場所で待つのではなく、コンテナと一緒に到着します。
イメージにファイルを 1 つコピーするだけ。同じバイナリが、マシンエージェントにも、他のマシンが参加する relay にも、ブラウザコンソールにも、ターミナルホストにも、AI ランタイムにもなります。違いは呼び出し方だけです。
1つの製品システム
1台のマシンから始めて、フリートへ拡張します。
ホスト上の共有エージェントは、すべてのコンテナの運用状態を抱え込み、そのすべてへのアクセスを必要とし、それ自体がインフラになります。イメージの中で届くエージェントはそうなりません。
cmdop sidecar はエージェントをバックグラウンドで起動し、その後あなたのコマンドを exec します。アプリケーションが PID 1 になるため、docker stop、シグナル、終了コード、再起動ポリシーは以前とまったく同じに振る舞います。

エージェントはバックグラウンドの子プロセスです。Docker はあなたのプロセスに直接シグナルを送り、その終了コードがコンテナの終了コードになります。
エージェントが起動できなくても relay に到達できなくても、アプリケーションは動き続けます。join key が未設定なら、sidecar はただの exec です。
コンテナ側から relay に接続します。受信ポートは開かず、ingress ルールも必要ありません。
バイナリは libc をリンクしないため、Alpine、Debian、distroless、scratch のいずれでも動きます。
稼働中のコンテナ内のシェルを、ブラウザからも CLI からもスマートフォンからも開けます。
コンテナ内のファイルを読み、差分を見て、編集します。範囲はエージェントに指定したディレクトリに限られます。
コンテナの中身の調査、変更、実行、デバッグをエージェントに任せられます。
任意の Cmdop 画面からコマンドを実行し、マシン間で作業を受け渡せます。
同じイメージがノート PC でも、Compose でも、すでにコンテナを動かしているどこででも動きます。500 個起動すれば、独立したエージェントが 500 個。管理性は隣に配備するものではなく、イメージの性質だからです。
イメージをビルドし、relay のアドレスと join key を環境変数で渡します。マシンは起動時に fleet に現れ、他に設定するものはありません。
公開リポジトリには、ごく普通の Node アプリに 15 行の Dockerfile を足した例があります。変数、それぞれが防ぐもの、そして今すぐ起動できるコンテナが揃っています。

公開デモはあえて大がかりな構成です。自前の relay をホストし、書き込み可能なプロジェクトを mount し、開発サーバーを走らせるので、エージェントが実アプリを編集し、その変更が Git 履歴に残るまでを見届けられます。
これは Cmdop の全体像を示すためのものです。すでにあるコンテナにエージェントを足すのは、変わらず 2 行です。
すでに出荷しているイメージにバイナリを追加するか、実例を clone してマシンが参加する様子を見てください。