Devcontainer アドオン
リポジトリに、再現可能で隔離された開発コンテナを用意します。人、エディター、コーディングエージェントのいずれもが使えるコンテナです。DWP v7(パック v7.9.0)では、このアドオンが devcontainer-kit を統合します。これは Deep Work Plan がなくても動作する MIT のプロダクトです。任意のアドオンであり、リポジトリはこれがなくても完全に適合します。
devcontainer-kit が提供するもの
- テンプレート。 Dev Containers 仕様に基づき、
dck initが一つの固定レイアウトでリポジトリに展開します:.devcontainer/devcontainer.json、docker/local/<service>/Dockerfile、docker/local/docker-compose.yaml、dev.sh。後から再実行すると調整を行い、あなたの編集を上書きすることはありません。既存ファイルへの変更はすべて事前に提示され、同意が必要です。 - リポジトリ専用のコンテナ。 Dockerfile はランタイムの公式イメージ(
node-24、python-3.13、debian)をダイジェストで固定して起点とし、キットのビルド手順をdocker/local/<service>/dck/にコピーします。共有ベースイメージは一切使いません。 dev.shとdck。bash dev.sh upは素のターミナルからコンテナをビルドし、起動し、アタッチします。shell、rebuild、doctorなどのコマンドは、VS Code や Cursor の有無を問わず動作します。- Herdr は双方向。 ホストの Herdr は、ループバック専用の SSH サーバーを通じて各コンテナを一台のマシンとしてアタッチし、コンテナは標準のサイドバー(App、Editor、Development、Agents)付きで開きます。すべてのワークスペースとペイン(後から開いたものも含む)は、アプリのパス(既定では
/app)で起動します。コンテナ内では herdr-peers により、エージェントがホストや他のコンテナにいるエージェントに問い合わせられます。 dck-dockerfileスキル。 エージェントが依頼に応じてリポジトリのコンテナを作成または再生成し、実際のビルドでそれを証明します。
インストール
git clone --branch v1.1.1 https://github.com/DailybotHQ/devcontainer-kit && ./devcontainer-kit/install.sh
cd your-repo && dck init && bash dev.sh up
要件:Linux または macOS ホスト上の bash 3.2 以降と python3 3.11 以降、そしてコンテナコマンド用の Docker と Compose v2。リリースは、その SHA256SUMS アセットで検証してください。v1.1.1 に固定してください。v0.2.0 はサポート対象外です。
| 項目 | 値 |
|---|---|
| プロダクト | DailybotHQ/devcontainer-kit、タグ v1.1.1、インターフェース 2 |
| レジストリキー | .dwp/config.json 内の devcontainer |
| リポジトリごとの設定 | .devcontainer/dck.toml |
| 検出 | dck doctor --json |
v1.0.0 以降は安定版です。 公開インターフェースはセマンティックバージョニングに従い、互換性のない変更は新しいメジャーバージョンでのみ行われます(ファイルについては、新しいインターフェース番号も伴います)。対象は、dck の動詞とドキュメント化されたフラグおよび終了コード(0 成功、1 失敗、2 使用法、3 設定、4 環境、5 拒否)、dck.toml、ホストプロファイル、dck doctor --json のスキーマ(インターフェース 2)、そしてレンダリング契約、すなわち dck init が書き込み所有するファイル、それが保持する dck:managed マーカーとユーザーブロック、エントリポイントが読み取る環境です。v0.3.7 からの移行で壊れるものはありません。dck init と dck rebuild を実行し、イメージに新しい固定バージョン(herdr-peers v1.1.0、coding-agents-kit v1.1.0、DeepWorkPlan Vim v1.0.1)を反映させてください。
レイヤー
どのコンテナにも開発ツール(git、gh、ripgrep、SSH サーバー、Herdr、herdr-peers)が含まれ、ホストのアカウントをオプトインしない限り、シークレットは一切含まれません。それ以外は、dck.toml で選ぶレイヤーです:
| レイヤー | デフォルト | 追加されるもの |
|---|---|---|
agents |
オフ | 検証済みリリースから取得する coding-agents-kit と、指定した CLI。各 CLI は専用の永続ボリュームを持ち、さらに classic(claudex、codexx、…)と providers(claude-glm、codex-azure、…)のプリセットが加わります。エージェントはデフォルトで自律モードで動作します。コンテナそのものがサンドボックスです。オプトアウト:サービスの .env に AGENTKIT_PERMISSIONS=ask。 |
editor |
オン | タグで固定した DeepWorkPlan Vim 入りの Neovim。オフにすると素のエディターになります。 |
dailybot |
オフ | dailybot アドオン用の Dailybot CLI。 |
ログイン、gh、Herdr の設定、git の ID は bash dev.sh rebuild の後も保持されます。agents レイヤーを有効にすると、イメージには coding-agents-kit の三つのスキル(agentkit、agentkit-setup、agentkit-orchestrate)も含まれます。これらは起動のたびに各エージェントのスキルディレクトリへリンクされるため、再作成したコンテナでも保持されます。
状態ボリューム(SSH ホスト鍵、~/.ssh、gh のログイン、Herdr クライアントの状態、履歴)の名前は state です。複数のサービスが一つの compose プロジェクトを共有する場合は、dck.toml の [compose] state_volume(または dck init --state-volume NAME)でそれぞれに固有の名前を付けてください。そうしないとすべてのサービスが同じボリュームをマウントし、dck doctor がその旨を報告します。
マシンをまたぐエージェント
v0.2.3 以降、Docker Desktop 上では dck up が手作業なしで双方向のメッシュを構成します。
- コンテナとホスト。 コンテナ内のエージェントは、ホスト上、他のすべての dck コンテナ内、そしてホストの Herdr がすでに管理している他のループバックコンテナ内の Herdr エージェントに到達でき、逆方向にも到達できます。すべてのピアは固定されたホスト鍵を持ち、初回利用時に信頼されるものはありません。
- 任意のホストリスナー。
dck setupは一度だけ、127.0.0.1上のユーザーレベルの SSH サーバーを提案します。このサーバーは dck の鍵のみを受け付け、launchd(macOS)によって稼働し続けます。すでにループバックのリスナーを動かしている場合は、代わりにホストプロファイルをそちらに向けてください。dck host listener disableで削除できます。 - 再構築後も保持。 コンテナの Herdr マシンカタログはボリューム上にあるため、
bash dev.sh rebuildの後も内部に登録されたすべてのマシンが保持されます。v0.3.2以降、rebuild、start、restartはupと同じ手順を実行します。コンテナはホストの Herdr に再登録され、ホスト鍵は再固定され、メッシュが再配布されるため、ゼロからビルドしたコンテナもすぐにホストとそのピアに到達できます。 - コンテナ内の Codex ペイン。 Codex エージェントが他のマシン上のピアに問い合わせるには、ホストに保存されたコンテナのマシン ID である
HERDR_PEERS_SELFが必要です。v0.3.3以降、キットは登録のたびにその ID を記録し、コンテナのログインシェルがそれをエクスポートするため、エージェントが手作業で設定する必要はありません。不一致はdck doctorが指摘します。v0.3.4以降、コンテナ自身の Codex 設定は、Codex の起動時の更新チェックとバックグラウンドデーモンをスキップします(キットがすべての CLI のバージョンを固定しているため)。ホストの Codex home や共有プロファイルには一切触れません。 - ホストからも返信。
dck setupはホストに検証済みの herdr-peers をインストールするため、ホストでもdck agentsとdck askが使え、ホストのエージェントはherdr-peers replyで応答します。 - キットが作成していないコンテナ。 それらがログインに使う公開鍵をホストプロファイルの
[ssh] authorized_extraに列挙すれば、それらのコンテナも dck コンテナに到達できます。
ホストとコンテナの両方で coding-agents-kit と組み合わせれば、同じ ak で両側のエージェントを起動できます。
コンテナ内のホストアカウント
コンテナは、ホストですでに持っているアカウントを使えます。git がすでにホストの SSH エージェントを通じて動いているのと同じように、コンテナ内でのログインは不要です。これはオプトインで、設定はあなたのホストプロファイルに置き、リポジトリの dck.toml には決して置きません。
[agents]
host_profiles = true # 既定は false
host_env_keys = ["ZAI_CODING_API_KEY"] # 共有する環境変数名の許可リスト
host_profiles を有効にすると、dck up はリポジトリがインストールする CLI のプロファイルだけを共有します。
- Claude Code はプロファイルごとの長期トークンで共有します。
@defaultにはCLAUDE_CODE_OAUTH_TOKEN、@nameにはCLAUDE_CODE_OAUTH_TOKEN_<SUFFIX>を使います(接尾辞は大文字にし、A-Z、0-9、_以外の文字は_に置き換えます)。 - Codex は認証ファイルで、
@defaultと各プロファイルについて共有します。 - キットの env ファイルは読み取り専用で、
host_env_keysにある名前だけに絞り込みます。
agentkit の home 全体がマウントされることはなく、ホストの絶対パスを含むプロファイルはスキップされます。読み書き可能で共有した Codex のログインは、二つの書き手から同時に更新される可能性があります。Codex アカウントごとに動かすエージェントは一つにしてください。ホストプロファイルの [agents] default_profile(例:{ claude = "@work3" })を設定すると、コンテナ内で引数なしの ak claude がその共有アカウントを使います(coding-agents-kit ≥ v0.5.2)。macOS の @default の Claude ログインはキーチェーンに保存されているため、共有できません。v0.3.4 以降は、コンテナのシェルが引数なしの claude や codex もそのアカウントに向けるため、Herdr が復元するペインはログイン画面ではなくそのアカウントで開きます。コンテナ内では、同じ ak <kind> @<profile> がホスト上と同じアカウントで動きます。これにより、リードは ak pick が選んだアカウントをコンテナのレーンに渡せます。詳しくは多数のエージェントを動かすを参照してください。
複数のリポジトリ、一つの compose スタック
v0.3.3 以降、サービスがより大きな compose プロジェクトの一部であるリポジトリ(API、Web アプリ、ワーカー、データベースが一つのプロジェクトを共有する構成)は、dck がレンダリングする内容を手で編集せずにそのプロジェクトに参加できます。変更はすべて追加的です。これらのキーを一つも設定しないリポジトリは、これまでとまったく同じようにレンダリングされます。
- 一つのプロジェクト、サービスごとに一つの状態ボリューム。
[compose] projectは各リポジトリで共有プロジェクトの名前を指定します。state_volume、[compose] networks、[compose] volumesは、各サービスの状態と、スタックのデータボリュームおよびネットワークを分離します。 - ユーザーブロック。 dck サービス内の
# >>> user:<service> >>>と# <<< user:<service> <<<の間の行はそのまま保持されます。dck がレンダリングしないもの(depends_on、healthcheck)には通常のキーを、dck がレンダリングするキーにはx-dck-merge:を使います。dck のマーカーの一部しか含まないファイルは、書き換えられるのではなく、修正方法を示して拒否されます。 - ポート文字列。
ssh_portとportsは"${API_PORT:-8000}:8000"のような compose 式を受け付けます。文字列がホスト IP を指定しない限り、127.0.0.1に留まります。 - 共有ビルドと独自のランチャー。
[build] contextと[build] dockerfileは複数のサービスで共有する Dockerfile に対応します。dev_sh = falseはリポジトリ独自のdev.shを保持します。 - ワークスペースのサテライト。
v0.3.5以降、独自の compose プロジェクトにあるサービスの二つ目のインスタンスは dck を通じて起動・停止します(dck --project P --compose-file F --service S upまたはdown)。そのため、メインのインスタンスと同じホストキー、アカウント、git の ID、Herdr マシンを得られます。up --seed-state-from VOLUMEは、ログイン情報だけをその空の状態ボリュームにコピーします。オーバーレイファイルでは、extendsに拡張元のファイルを指定する必要があります。 - エージェント用の Node。 エージェント自身の Node は
/opt/dck/node配下にあり、イメージの Node を置き換えることはありません。リポジトリのツールがそれを必要とする場合は、[agents] node_first = trueで PATH の先頭に置きます。
コンテナ内のホストの SSH 鍵
一部のツールは鍵ファイルだけを読み、転送されたエージェントを無視します。たとえば gh auth login は新しい鍵の生成を提案します。v0.3.2 以降はオプトインできます。設定できるのはホストプロファイルのみです(リポジトリの dck.toml では設定できません。dck setup が一度だけ尋ね、デフォルトは「いいえ」です):
[ssh]
copy_keys = true # default false
有効な間、dck up はホストの ~/.ssh を読み取り専用で ~/.ssh_host にバインドし、起動のたびにその id_* 鍵をコンテナの ~/.ssh にコピーして(秘密鍵は 0600)、ホストと同期させます。エージェント転送は変わらず、無効にすると次回の起動時にコピーは削除されます。代償として、ホストの ~/.ssh 全体がコンテナ内から読み取り可能になり、秘密鍵は状態ボリュームに保存されます。
セキュリティのデフォルト
- 公開されるポートはすべて、
dck.tomlがbindを設定しない限り127.0.0.1にバインドされます。 - SSH 経由の git はホストの SSH エージェントを通ります。使うのはそのソケットであり、鍵ファイルも、マウントした
~/.sshや~/.gitconfigも使いません(ホストプロファイルでcopy_keysを有効にした場合を除きます)。git の ID はdck setupが埋めるDCK_GIT_*の値から取得します。 - SSH ホスト鍵は実行時にプロジェクトごとのボリュームへ生成され、イメージに焼き込まれることはありません。サーバーは公開鍵のみを受け付け、root ログインもパスワードも許可しません。
- テンプレートは
cap_add、privilegedモード、Docker ソケットのいずれも追加しません。 - すべてのダウンロードはバージョンで固定され、チェックサムで検証されます。ベースイメージはダイジェストで固定されます。
- あるコンテナのエージェントが他のコンテナに到達できる Herdr メッシュはデフォルトで有効であり、その無効化の方法はキットの脅威モデルに記載されています。ホストリスナーは、実行中のコンテナ内のコードがあなたとしてホスト上でシェルを開くことを可能にします。これはオプトインで、ループバック限定であり、dck の鍵のみを受け付け、
dck host listener disableで削除できます。
補足
任意であり、必須となることはありません。リポジトリはオプションアドオンがゼロでも完全に適合します。Linux と macOS のホストがサポートされています。コンテナ間のメッシュには Docker Desktop が必要です。