Addon Devcontainer
Zapewnij repozytorium powtarzalny, odizolowany kontener deweloperski — taki, z którego mogą korzystać ludzie, edytory i agenci kodujący. W DWP v7 (pakiet v7.8.0) ten addon integruje devcontainer-kit, produkt na licencji MIT działający bez Deep Work Plan. Jest opcjonalny: repozytorium bez niego jest w pełni zgodne.
Co zapewnia devcontainer-kit
- Szablon oparty na specyfikacji Dev Containers, który
dck initrenderuje w repozytorium w jednym stałym układzie:.devcontainer/devcontainer.json,docker/local/<service>/Dockerfile,docker/local/docker-compose.yamlidev.sh. Uruchomiony ponownie później uzgadnia zmiany i nigdy nie nadpisuje Twoich edycji; każda zmiana istniejącego pliku jest najpierw pokazywana i wymaga zgody. - Własny kontener repozytorium. Dockerfile zaczyna od oficjalnego obrazu środowiska uruchomieniowego przypiętego przez digest —
node-24,python-3.13lubdebian— i kopiuje kroki budowania kitu dodocker/local/<service>/dck/. Nie jest używany żaden wspólny obraz bazowy. dev.shidck.bash dev.sh upbuduje, uruchamia i podłącza kontener ze zwykłego terminala;shell,rebuild,doctori pozostałe polecenia działają z VS Code lub Cursor albo bez nich.- Herdr w obie strony. Herdr na hoście dołącza każdy kontener jako maszynę przez serwer SSH nasłuchujący wyłącznie na loopbacku, a kontener otwiera się ze standardowym paskiem bocznym: App, Editor, Development i Agents. Każda przestrzeń robocza i każdy panel, także otwarte później, startują w ścieżce aplikacji (domyślnie
/app). Wewnątrz herdr-peers pozwala agentom zwracać się do agentów na hoście i w innych kontenerach. - Skill
dck-dockerfile. Agent na żądanie tworzy lub regeneruje kontener repozytorium i potwierdza go rzeczywistym buildem.
Instalacja
git clone --branch v1.0.0 https://github.com/DailybotHQ/devcontainer-kit && ./devcontainer-kit/install.sh
cd your-repo && dck init && bash dev.sh up
Wymagania: bash 3.2 lub nowszy oraz python3 3.11 lub nowszy na hoście z Linuksem lub macOS, a także Docker z Compose v2 dla poleceń kontenera. Zweryfikuj wydanie za pomocą jego zasobu SHA256SUMS. Przypnij v1.0.0: v0.2.0 nie jest obsługiwane.
| Element | Wartość |
|---|---|
| Produkt | DailybotHQ/devcontainer-kit, tag v1.0.0, interfejs 2 |
| Klucz rejestru | devcontainer w .dwp/config.json |
| Konfiguracja repozytorium | .devcontainer/dck.toml |
| Wykrywanie | dck doctor --json |
Stabilny od v1.0.0. Publiczny interfejs stosuje wersjonowanie semantyczne i zmienia się niekompatybilnie wyłącznie w nowej wersji głównej (a w przypadku plików — z nowym numerem interfejsu): czasowniki dck wraz z udokumentowanymi flagami i kodami wyjścia (0 sukces, 1 błąd, 2 użycie, 3 konfiguracja, 4 środowisko, 5 odmowa), schematy dck.toml, profilu hosta i dck doctor --json (interfejs 2) oraz kontrakt renderowania — pliki, które dck init zapisuje i którymi zarządza, znaczniki dck:managed i bloki użytkownika, które zachowuje, oraz środowisko odczytywane przez entrypoint. Przy przejściu z v0.3.7 nic się nie psuje: uruchom dck init i dck rebuild, aby obraz zawierał nowe przypięte wersje (herdr-peers, coding-agents-kit i DeepWorkPlan Vim, każdy w v1.0.0).
Warstwy
Każdy kontener zawiera narzędzia deweloperskie — git, gh, ripgrep, serwer SSH, Herdr i herdr-peers — i żadnego sekretu, chyba że włączysz konta hosta. Reszta to warstwa, którą wybierasz w dck.toml:
| Warstwa | Domyślnie | Co dodaje |
|---|---|---|
agents |
wył. | coding-agents-kit z jego zweryfikowanego wydania i wymienione przez Ciebie CLI, każde z własnym trwałym wolumenem, a także presety classic (claudex, codexx, …) i providers (claude-glm, codex-azure, …). Agenci domyślnie działają w trybie autonomii — piaskownicą jest kontener. Rezygnacja: AGENTKIT_PERMISSIONS=ask w pliku .env usługi. |
editor |
wł. | Neovim z DeepWorkPlan Vim przypiętym po tagu; wyłączenie daje zwykły edytor. |
dailybot |
wył. | CLI Dailybot, dla addonu dailybot. |
Zalogowania, gh, konfiguracja Herdr i tożsamość git przetrwają bash dev.sh rebuild. Z warstwą agents obraz zawiera też trzy skille coding-agents-kit (agentkit, agentkit-setup, agentkit-orchestrate), linkowane przy każdym starcie do katalogu skilli każdego agenta, więc odtworzony kontener je zachowuje.
Wolumen stanu (klucz hosta SSH, ~/.ssh, logowanie gh, stan klienta Herdr, historia) nazywa się state. Gdy kilka usług współdzieli jeden projekt compose, nadaj każdej własną nazwę przez [compose] state_volume w dck.toml (lub dck init --state-volume NAME); w przeciwnym razie wszystkie montują ten sam wolumen, a dck doctor to zgłasza.
Agenci na wielu maszynach
Od v0.2.3 dck up zestawia dwukierunkową sieć bez żadnego ręcznego kroku, w Docker Desktop:
- Kontenery i host. Agenci wewnątrz docierają do agentów Herdr na hoście, w każdym innym kontenerze dck i w pozostałych kontenerach loopback, którymi Herdr na hoście już zarządza — a tamci docierają z powrotem. Każdy peer ma przypięty klucz hosta; nic nie jest zaufane przy pierwszym użyciu.
- Opcjonalny listener na hoście.
dck setupjednorazowo proponuje serwer SSH na poziomie użytkownika na127.0.0.1, który akceptuje wyłącznie klucz dck i jest utrzymywany w działaniu przez launchd (macOS). Jeśli już uruchamiasz listener loopback, wskaż go zamiast tego w profilu hosta.dck host listener disablego usuwa. - Przetrwa przebudowy. Katalog maszyn Herdr kontenera znajduje się na wolumenie, więc
bash dev.sh rebuildzachowuje każdą zarejestrowaną w nim maszynę. Odv0.3.2rebuild,startirestartwykonują te same kroki coup: kontener zostaje ponownie zarejestrowany w Herdr hosta, jego klucz hosta ponownie przypięty, a konfiguracja sieci rozesłana do peerów, więc kontener zbudowany od zera od razu dociera do hosta i swoich peerów. - Panele Codex wewnątrz kontenera. Agent Codex potrzebuje
HERDR_PEERS_SELF, czyli identyfikatora maszyny kontenera zapisanego na hoście, aby pytać peerów na innych maszynach. Odv0.3.3kit zapisuje ten identyfikator przy każdej rejestracji, a powłoki logowania kontenera go eksportują, więc żaden agent nie ustawia go ręcznie;dck doctorzgłasza niezgodność. Odv0.3.4własne konfiguracje Codex w kontenerze pomijają sprawdzanie aktualizacji Codex przy starcie i jego demona w tle (kit przypina wersję każdego CLI), nigdy nie dotykając katalogu domowego Codex na twoim hoście ani współdzielonego profilu. - Odpowiedzi także z hosta.
dck setupinstaluje na hoście zweryfikowany herdr-peers, więcdck agentsidck askdziałają również tam, a agenci hosta odpowiadają przezherdr-peers reply. - Kontenery, których kit nie utworzył. Wypisz klucze publiczne, którymi się logują, w
[ssh] authorized_extraw profilu hosta, a one również będą mogły docierać do kontenerów dck.
Połącz go z coding-agents-kit na hoście i w kontenerze, a to samo ak uruchamia agentów po obu stronach.
Konta hosta wewnątrz kontenera
Kontener może korzystać z kont, które masz już na hoście — tak jak git już działa przez agenta SSH hosta — bez logowania w środku. To opcja do włączenia, zapisana w Twoim profilu hosta, nigdy w dck.toml repozytorium:
[agents]
host_profiles = true # domyślnie false
host_env_keys = ["ZAI_CODING_API_KEY"] # lista dozwolonych nazw zmiennych do udostępnienia
Przy włączonym host_profiles polecenie dck up udostępnia tylko profile CLI instalowanych przez repozytorium:
- Claude Code przez długoterminowy token na profil:
CLAUDE_CODE_OAUTH_TOKENdla@defaultiCLAUDE_CODE_OAUTH_TOKEN_<SUFFIX>dla@name(sufiks wielkimi literami, każdy znak spozaA-Z,0-9i_zamieniony na_). - Codex przez swój plik uwierzytelniania, dla
@defaulti dla każdego profilu. - Plik env kitu, tylko do odczytu i ograniczony do nazw z
host_env_keys.
Cały katalog domowy agentkit nigdy nie jest montowany, a profile zawierające bezwzględne ścieżki hosta są pomijane. Logowanie Codex udostępnione do odczytu i zapisu może zostać odświeżone przez dwóch piszących naraz: utrzymuj jednego aktywnego agenta na konto Codex. [agents] default_profile w profilu hosta (na przykład { claude = "@work3" }) sprawia, że samo ak claude wewnątrz kontenera używa tego udostępnionego konta (coding-agents-kit ≥ v0.5.2); logowanie Claude @default na macOS znajduje się w pęku kluczy (Keychain) i nie może zostać udostępnione. Od v0.3.4 powłoki kontenera kierują też samo claude lub codex na to konto, więc panele przywracane przez Herdr otwierają się na nim zamiast na ekranie logowania. Wewnątrz kontenera to samo ak <kind> @<profile> działa na tym samym koncie co na hoście, dzięki czemu prowadzący może przekazać torom w kontenerach konta wybrane przez ak pick — zobacz Uruchamianie wielu agentów.
Wiele repozytoriów, jeden stos compose
Od v0.3.3 repozytorium, którego usługa jest częścią większego projektu compose (API, aplikacja webowa, workery i baza danych w jednym projekcie), może do niego dołączyć bez ręcznej edycji tego, co generuje dck. Wszystko jest addytywne: repozytorium, które nie ustawia żadnego z tych kluczy, jest generowane dokładnie tak jak wcześniej.
- Jeden projekt, jeden wolumen stanu na usługę.
[compose] projectwskazuje wspólny projekt w każdym repozytorium;state_volume,[compose] networksi[compose] volumesrozdzielają stan każdej usługi oraz wolumeny danych i sieci stosu. - Blok użytkownika. Wiersze między
# >>> user:<service> >>>a# <<< user:<service> <<<wewnątrz usługi dck są zachowywane dosłownie: zwykłe klucze dla tego, czego dck nie generuje (depends_on,healthcheck), orazx-dck-merge:dla kluczy, które generuje. Plik zawierający tylko część znaczników dck jest odrzucany ze wskazaniem poprawki, zamiast zostać nadpisany. - Porty jako ciągi znaków.
ssh_portiportsprzyjmują wyrażenia compose, takie jak"${API_PORT:-8000}:8000"; pozostają na127.0.0.1, chyba że ciąg wskazuje adres IP hosta. - Wspólne buildy i własny launcher.
[build] contexti[build] dockerfileobsługują Dockerfile współdzielony przez kilka usług;dev_sh = falsezachowuje własnydev.shrepozytorium. - Satelity przestrzeni roboczej. Od
v0.3.5druga instancja usługi we własnym projekcie compose jest uruchamiana i zatrzymywana przez dck (dck --project P --compose-file F --service S uplubdown), więc dostaje ten sam klucz hosta, te same konta, tę samą tożsamość git i tę samą maszynę Herdr co instancja główna;up --seed-state-from VOLUMEkopiuje do jej pustego wolumenu stanu wyłącznie logowania. W pliku nakładkiextendsmusi wskazywać plik, który rozszerza. - Node dla agentów. Własny Node agentów znajduje się w
/opt/dck/nodei nigdy nie zastępuje Node z obrazu;[agents] node_first = truestawia go na początku PATH, gdy wymagają tego narzędzia repozytorium.
Klucze SSH hosta wewnątrz kontenera
Niektóre narzędzia czytają wyłącznie pliki kluczy i ignorują przekazanego agenta: na przykład gh auth login proponuje wygenerowanie nowego klucza. Od v0.3.2 możesz to włączyć, wyłącznie w Twoim profilu hosta (dck.toml repozytorium nie może tego ustawić; dck setup pyta raz, domyślnie nie):
[ssh]
copy_keys = true # default false
Gdy opcja jest włączona, dck up montuje ~/.ssh hosta tylko do odczytu w ~/.ssh_host, a każdy start kopiuje jego klucze id_* do ~/.ssh kontenera (klucze prywatne 0600), utrzymując je w zgodzie z hostem. Przekazywanie agenta pozostaje bez zmian, a wyłączenie opcji usuwa kopie przy następnym starcie. Koszt: cały ~/.ssh hosta jest czytelny wewnątrz kontenera, a klucze prywatne spoczywają w wolumenie stanu.
Domyślne ustawienia bezpieczeństwa
- Każdy publikowany port wiąże się z
127.0.0.1, chyba żedck.tomlustawiabind. - Git przez SSH działa przez agenta SSH hosta — jego gniazdo, nigdy plik klucza i nigdy zamontowany
~/.sshani~/.gitconfig, chyba że w Twoim profilu hosta włączonocopy_keys. Tożsamość git pochodzi z wartościDCK_GIT_*, które wypełniadck setup. - Klucze hosta SSH są generowane w czasie działania do wolumenu danego projektu i nigdy nie są wbudowywane w obraz; serwer akceptuje tylko klucze publiczne, bez logowania jako root i bez haseł.
- Szablon nie dodaje
cap_add, trybuprivilegedani gniazda Dockera. - Każde pobranie jest przypięte do wersji i weryfikowane sumą kontrolną; obraz bazowy jest przypięty przez digest.
- Sieć Herdr, przez którą agenci w jednym kontenerze docierają do pozostałych, jest domyślnie włączona i opisana wraz ze sposobami jej wyłączenia w modelu zagrożeń kitu. Listener na hoście pozwala kodowi w działającym kontenerze otworzyć powłokę na hoście jako ty: wymaga świadomego włączenia, działa tylko na loopback, akceptuje wyłącznie klucz dck i usuwa się go poleceniem
dck host listener disable.
Uwagi
Opcjonalny i nigdy niewymagany. Repozytorium bez opcjonalnych addonów jest w pełni zgodne. Obsługiwane są hosty z Linuksem i macOS; sieć między kontenerami wymaga Docker Desktop.