OpenCode コンテナ内で Docker を直接使えるようにする(docker-mcp の廃止) #4
Labels
No labels
enhancement
No milestone
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
genji1024/containerized-agents#4
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
目的・背景
現状、OpenCode コンテナから Docker を操作する手段は docker-mcp(MCP サーバー経由)のみです。docker-mcp はビルドコンテキストが
/workspace配下に限定される制約があり、OpenCode の作業ディレクトリ(${HOME}/repos/...)とパスが一致しないため、docker buildがresolves outside of /workspace; refusing to buildで失敗します。これが Docker 動作確認の不十分さ(private-opencode-server PR #4 のレビュー指摘)の根本原因です。本イシューでは、docker-mcp を廃止し、OpenCode コンテナに docker CLI を導入してホストの Docker daemon を直接利用できるようにします。
現状(調査結果)
node:26.3.0-trixie-slimベース。docker CLI なし。docker:27-dindベース +privileged: true。コンテナ内 dockerd を起動し、Python MCP サーバー(server.py)が docker CLI を subprocess 実行。DOCKER_MCP_URL=http://docker-mcp:3004/mcpを環境変数で保持し、opencode.jsoncのdockerMCP(remote)経由で操作。/var/run/docker.sockのマウントは全サービスで無し。privilegedは docker-mcp のみ。実装方針(推奨)
Docker outside of Docker(DooD)方式 + docker-mcp 廃止
/var/run/docker.sockを OpenCode コンテナへ bind マウントし、OpenCode に docker CLI を追加する。${HOME}/repos/をホストと同一パスでマウント済みのため、コンテナ内で実行するdocker buildのビルドコンテキストをホスト daemon が同一パスで解決でき、旧 docker-mcp の/workspaceパス不一致が解消される。(代替案: OpenCode を privileged にして DinD を持ち込む — 却下。重く、ビルドコンテキストのパス問題も残るため。)
変更内容(予定)
dockerfiles/opencode/Dockerfileapt-get install -y docker.io、または Docker 公式リポジトリから docker-ce-cli)。compose.yamldocker-mcpサービス定義を削除。opencodeサービスのdepends_onからdocker-mcpを削除。opencodeサービスに/var/run/docker.sockの bind マウントを追加。DOCKER_MCP_URL環境変数を削除。.config/opencode/opencode.jsoncdockerMCP 定義を削除。.config/opencode/agents/verifier.md(および docker MCP を参照するエージェント定義)docker_*MCP ツール参照を、bash での docker CLI 実行(許可リスト更新含む)に変更。dockerfiles/docker-mcp/ディレクトリを削除。README.mdセキュリティ上の注意
/var/run/docker.sockのマウントはホスト root 相当の権限をコンテナに与えます。一方、現在の docker-mcp のprivileged: trueを廃止できるため、スタック全体の privileged 面は縮小します。~/.agents/~/.config/opencode/~/repos等)をマウント済みであり、同等の信頼を前提とした構成です。ホスト daemon 上の他サービス(forgejo-mcp 等)を誤って操作しないよう、運用上の注意を README に明記する予定です。検証方法
docker compose -f compose.yaml build opencode(CLI 追加を反映)。docker compose -f compose.yaml run --rm --service-ports opencodeで起動。docker version/docker psが成功し、ホスト daemon が見えることを確認。docker run --rm hello-worldが成功することを確認。${HOME}/repos/...配下の Dockerfile をビルドコンテキストに指定したdocker buildが成功すること(旧 docker-mcp のパス制約の解消確認)。docker compose psに docker-mcp が現れないことを確認。関連
@bot-genji1024
これについて詳しく説明してください。安全性の観点を重視して、DinD の選択肢を排除せずに再検討してください。
@genji1024 ご要請いただいた「DinD の選択肢を排除せずに再検討」について、安全性の観点を中心に詳しく説明します。
現状の整理
まず重要な前提として、現在の docker-mcp は既に DinD で動いています。
compose.yamlでdocker-mcpサービスはdocker:27-dindイメージ +privileged: trueで起動し、コンテナ内でdockerdを実行しています。つまり現状のスタックには既に privileged コンテナが1つ常駐しています。Issue #4 で検討していたのは「この docker-mcp(DinD)を廃止して何に置き換えるか」であり、選択肢は以下の2つです:
/var/run/docker.sockをマウントprivileged: trueにしてコンテナ内でdockerdを起動案A(DooD)と案B(DinD)の詳細比較
セキュリティ面
privileged: trueを廃止でき、スタック全体の privileged 面はゼロになる両者とも「コンテナ内プロセスが host root 相当の権限を得る」という意味で最悪ケースの深刻度は同等ですが、攻撃経路と爆発半径が異なります:
ビルドコンテキストのパス問題
Issue 本文では案Bについて「ビルドコンテキストのパス問題も残る」と却下しましたが、この論拠は正確ではありませんでした。検証の結果:
${HOME}/reposがホストと同一パスでマウントされているため、ホスト daemon が同一パスでビルドコンテキストを解決できる → パス問題は解消する${HOME}/reposをネストコンテナにも同一パスでマウントすれば、ネスト daemon が同一パスで解決できる → パス問題は同様に解消しうるつまりパス問題は案A・案Bいずれでも解決可能であり、却下の根拠としては成立しませんでした。訂正してお詫びします。
運用面
安全性重視での再検討結果
安全性を第一軸として再検討した結果、両者一長一短であり、単一の優位性では決定できません。以下の判断基準を提示します:
案A(DooD)を選ぶべき場合
案B(DinD)を選ぶべき場合
私の見解
現状既に docker-mcp が privileged で常駐しているため、「privileged をゼロにできる」案Aの利点は実利的です。他サービス誤操作リスクについては、OpenCode が既にホストの広範なディレクトリをマウントしており、同等の信頼を前提としているため、運用上の注意で担保可能と判断します。
ただし、genji1024 さんが隔離性(他サービスへの誤操作排除)を優先される場合は案Bも妥当な選択です。その場合、パス問題は解消可能であるため、Issue 本文の却下理由は撤回します。
どちらの案を採用するかご指示ください。承認いただいた案で実装を進めます。
@bot-genji1024 隔離性を優先して案Bを採用します。実装と PR 作成をお願いします。実環境では Rootless Docker で運用していることに気を付けてください。
docker-mcpは問題なく動いているので、そちらと同じ構成にしておくのが安全だと思います。進捗報告
Issue #4 の実装を完了し、PR を作成しました。
docker:27-dindに変更し、docker-mcp を廃止しましたdocker:27-dind+privileged: true)を踏襲しています@genji1024 レビューをお願いいたします