Grandream
Orca ADEをSandboxへ繋ぐ|Docker Sandboxes
連載「Docker Sandboxesでコーディングエージェントを隔離する」第7回(最終回)/検証日: 2026年8月23日/
sbx0.39.0・Orca 1.4.182
第5回でCodex AppとClaude DesktopからSSHで入れるところまで作りました。最後は、同じSandboxをOrca ADEの実行ホストとして登録します。
ssh sampleapp.sbx -- echo connectedは最初から通っていました。それでもOrcaからは動かず、層の違う2箇所で詰まりました。node-ptyのビルドでg++が見つからず、その次は「projectは認識しているがsetupされていない」と言われる。どちらもSSHの問題ではありません。
繋ぐまでに層が4つある
remote IDEを繋ぐ作業は、成功条件が段になっています。ここを分けずに触ると、直した場所と直った理由が対応しません。
層 | 成功条件 |
|---|---|
Docker Sandbox |
|
OpenSSH |
|
Orca relay upload | Orcaが接続先へrelayを配置できる |
Orca relay build | relayの依存(native addon含む)をremote側でインストールできる |
Orca project host setup | そのホスト上のGit checkoutパスが |
Agent session | Codex/Claudeのterminalが対象worktreeで起動する |
plain SSHが通ることは、上から2段目の合格でしかありません。 今回詰まったのは4段目と5段目で、対処先はそれぞれ別でした。
順番も決まっています。plain SSHを先に証明してからOrcaを触る。逆にすると、Orca側の設定をいくら変えても通らない状態で時間を使います。
sbx daemon status
sbx ls
ssh sampleapp.sbx -- echo connected # ここまで通してからOrcaへ
Orca側の登録も、接続とproject setupの2段
Orcaの設定は2箇所です。まずConnections(remote host設定)へSSH接続を1つ追加します。
SSH Host: sampleapp.sbx
SSH Port: 空欄
Username: 空欄
Identity File: 空欄
Port・Username・鍵をすべて空欄にできるのは、第5回で書いたとおり認証をdaemonとDocker loginが担うからです。~/.ssh/configにはwildcardのHost *.sbxが入るだけなので、UIの候補一覧にsampleapp.sbxが出てこないことがあります。その場合はhostnameを手入力します。
Codex・Claude・Orcaのすべてを同じsampleapp.sbxへ向けます。第6回で決めたとおりSandboxは1つなので、接続先も1つです。
もう1箇所がproject host setupで、これが後述するエラー3の舞台になります。
詰まり1: node-ptyがg++を探して落ちる
Orcaがremote側で実行したのはこれです。
npm install --ignore-scripts=false --omit=dev --no-audit --no-fund \
'node-pty@1.1.0' '@parcel/watcher@2.5.6'
そして失敗しました。ログの要点だけ抜き出します。
node@22.12.0 | linux | arm64
Rebuilding because .../prebuilds/linux-arm64 does not exist
gyp info spawn make
make: g++: No such file or directory
make: *** [pty.target.mk:117: Release/obj.target/pty/src/unix/pty.o] Error 127
読む順番はこうです。Node.jsは起動していて、headerのdownloadも済み、Pythonとmakeも見つかっている。linux-arm64用のprebuiltバイナリが無いのでソースビルドへfallbackし、その最初のコンパイルでC++コンパイラが無くて止まった。つまりNode.jsやnpmの問題ではなく、OS側のビルドツールチェーンの不足です。
ここが今回いちばん学びのあった点でした。アプリ本体がnative addonを使っていなくても、remote IDE側がterminalやfile watcherのためにC/C++ツールチェーンを要求します。今回の要求元はnode-ptyと@parcel/watcherで、どちらもアプリの依存ではありません。npm ciが通る環境かどうかでは発見できない要件です。Apple silicon上でもSandbox内はLinux arm64で、この組み合わせのprebuiltが無いことも重なりました。
診断のためなら、Sandbox内で直接入れて確かめられます。
sudo env DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential
ただし手で入れた分はSandboxを作り直すと消えるので、恒久対策はKit(第1回)に書くことです。置く位置に注意が必要でした。第1回のinstall処理はNode.jsが期待バージョンなら早期にexit 0しますが、build-essentialはその判定より前に置きます。Node.jsが揃っているだけでは、node-gyp rebuildは通りません。
apt-get update
env DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
build-essential ca-certificates curl vim xz-utils
expected_node="v22.12.0"
if [ "$(node --version 2>/dev/null || true)" = "$expected_node" ]; then
exit 0
fi
入ったかどうかは、sbx execとSSHの両方から見ます。経路が違うので、片方だけ通ることがあります。
sbx exec sampleapp g++ --version
ssh sampleapp.sbx -- g++ --version
余談ですが、同じログにはfind Python using Python version 3.14.xも出ていました。新しいPythonが目に入ると原因に見えますが、実際に落ちたのはその後のg++: No such file or directoryです。versionやwarningより、最後に失敗したコマンドとexit codeを優先します。
詰まり2: project tracked ... but not set upはSSH障害ではない
ツールチェーンを入れたら接続エラーは消え、代わりにOrcaがこう言いました。
project tracked on this host but not set up
紛らわしい表示ですが、接続は成功しています。OrcaはプロジェクトとSSH hostの組み合わせを認識した一方で、そのホスト上のcheckoutパスが未登録という状態です。概念的にはこうなっています。
{
"projectId": "github:example-org/sampleapp",
"hostId": "ssh:<ssh-host-id>",
"path": "",
"setupState": "not-set-up"
}
pathが空なので、直すのはpathだけです。ここでSSH設定やNode.jsやbuild-essentialを触り直す必要はありません。エラーが指している層にだけ手を入れます。
登録するpathは推測しません。SSH接続直後の初期ディレクトリは/home/agent/workspaceでしたが、ここはGit checkoutではありませんでした。作業先はSandbox内のprivate cloneで、パスはバージョンや作成方法で変わり得ます。
sbx exec sampleapp git rev-parse --show-toplevel
ssh sampleapp.sbx -- git rev-parse --show-toplevel
git rev-parse --show-toplevelが返す場所をsource of truthにします。登録先が満たすべき条件は4つです。
.gitが存在するgit remote -vが想定のリポジトリを指す- 読み書きできるprivate cloneである
/run/sandbox/sourceではない
最後の1つは第1回で書いた読み取り専用マウントです。参照元なので登録してはいけません。
OrcaのUIでは、該当プロジェクトのhost setupから次を指定します(表記はバージョンで多少変わります)。
- Host:
sampleapp.sbx - Method:
Existing folder(Clone repositoryではない) - Path:
git rev-parseで確認したprivate cloneの絶対パス - Kind:
Git
sbx create --cloneがすでにcheckoutを作っているので、Orcaに再cloneさせる必要はありません。保存後はpathが埋まりsetupStateがreadyになります。
project setupはSSH host単位です。Sandboxを1つに統合した構成(第6回)では、この登録も1回で済みます。エージェントごとにSandboxを分けていたら、ホストごとに同じ作業を繰り返すことになっていました。
状態はCLIから確認できます。
orca status --json # runtime.appVersion もここで分かる
orca project list --json
orca project setups --json
Orca 1.4.182のCLI helpにはproject setup-existing-folderがあります。ただし同じhelpに、SSH targetの設定はdesktop clientがSSH connectionを所有するためUIから行うと明記されています。CLIで無理に通そうとしないほうが早いです。これらのJSONをissueや記事へ貼るときは、project ID・host ID・ユーザー名・絶対パスを匿名化します。
Kitの直しはsbx kit addで既存Sandboxへ入ることがある
build-essentialの追加のように、Kitへ後から足したい変更が出てきます。第5回では「Kit変更は作り直し」と書きましたが、mixinの変更内容によっては既存Sandboxへ適用できます。
sbx kit add sampleapp ./.sbx/sampleapp
sbx kit は手元の0.39.0では experimental 表示付きのコマンド群です。挙動が変わり得る前提で使います。
対応範囲外の変更(agent type、workspace mode、port mappingなど)は作り直しです。作り直す前に未pushの変更を確認する手順は第5回のままです。
日常はhostを固定して、agentだけ切り替える
ここまで通ると、普段の操作は2択になります。
作業 | Agent | Host |
|---|---|---|
実装 | Codex |
|
レビュー | Claude |
|
hostは固定で、taskに応じてagentを選ぶだけです。同じprivate cloneなので、未コミット変更もbranchも開発サーバーもそのまま引き継がれます(第6回)。並列で動かすときだけ、Sandbox内でGit worktreeを分け、branch切り替えの前に他sessionの状態を見ます。
環境が壊れたら、Kitとランチャーと Gitから作り直せます。手で入れたものが無い状態を保つ限り、再構築はsetup一発です。
まとめ
第7回の要点です。
- remote IDEの接続は層になっている。plain SSHが通ることは全体の成功条件ではない
- remote IDEはterminalやfile watcherのためにC/C++ツールチェーンを要求する。
build-essentialはKitへ、しかもNode.jsの早期exit 0より前に置く project tracked ... but not set upはSSH障害ではなくpath未登録。git rev-parse --show-toplevelで実checkoutを特定し、/run/sandbox/sourceは登録しない- project setupはSSH host単位。Sandboxを1つにしていれば登録も1回
- ログはversionやwarningより、最後に失敗したコマンドとexit codeを読む
連載はここまでです。7回を通して繰り返し出てきたのは、境界を1つずつ決めて、壊れた層だけを直すという進め方でした。ホストとSandboxの境界、エージェント同士の境界、credentialの境界、そして接続の層。どれも一度決めて書き残せば、次に同じ場所で迷いません。
連載の構成
- clone modeで作る初期設定
- 1つのSandboxにCodexとClaudeを同居させる
GH_TOKENで権限を絞る- sentinelが見えても注入は成功していない
- Codex AppとClaude Desktopから入る
- Sandboxを1つにした判断
- Orca ADEをSandboxへ繋ぐ(本記事)
参考資料
- Editor and app integrations(Docker公式ドキュメント)
- Docker Sandboxes Kit reference(Docker公式ドキュメント)
- Docker Sandboxes release notes(Docker公式ドキュメント)
- Docker Sandboxes overview(Docker公式ドキュメント)
本記事はsbx 0.39.0・Orca 1.4.182で2026年8月23日に検証した内容です。Orca固有のproject host setupと「SSH targetはデスクトップUIで設定する」という記述は、version-matchedのCLI helpと実測に基づきます。将来のバージョンではUI名もCLIの対応範囲も変わり得ます。
関連記事
Grandream
株式会社グランドリーム
AI・システム開発のプロフェッショナルチームです。AIエージェント・業務自動化・Webシステム開発などを手がけています。



