Sandboxes: shell, exec og livscyklus
En container på Nordkraft kan bruges som en sandbox: et sted hvor et program — eller en AI-agent — kører kommandoer, og som rydder op efter sig selv. Tre ting gør det muligt: en interaktiv shell, et exec-kald til scripts og orkestratorer, og en livscyklus der er en del af containerens spec.
Det hele kører over din WireGuard-forbindelse. Der er ingen ekstra login: netværket er adgangskontrollen, præcis som for resten af platformen.
Shell
Du får en rigtig terminal (pty): piletaster, top, vim, resize af vinduet — alt virker som med kubectl exec -it. exit lukker sessionen, og exit-koden fra shellen bliver CLI'ens exit-kode.
Exec
nordkraft exec myapp -- ls -la /data
nordkraft exec myapp --cwd /app -e DEBUG=1 -- ./migrate.sh
echo "SELECT 1" | nordkraft exec db --stdin -- psql -U app
nordkraft exec myapp --timeout 30 -- ./slow-job # exit 124 ved timeout
exec kører én kommando, skriver stdout og stderr igennem og afslutter med kommandoens exit-kode. Det gør den brugbar i scripts (if nordkraft exec …) og som byggesten for orkestratorer, der vil have et REST-kald i stedet:
curl -X POST http://172.20.0.254:8001/api/containers/myapp/exec \
-H 'Content-Type: application/json' \
-d '{"cmd":["sh","-c","echo hej"],"cwd":"/tmp","env":{"X":"1"},"timeout_s":60}'
# {"exit_code":0,"stdout":"hej\n","stderr":"","duration_ms":41,"truncated":false}
Output er begrænset til 1 MiB pr. kald (truncated: true hvis der blev klippet). Brug logs eller en fil i containeren til mere.
Livscyklus
Livscyklussen er en del af .nk-spec'en, så den følger containeren gennem deploy, init og upgrade:
[lifecycle]
restart = "never" # always | unless-stopped | on-failure | never
auto_stop = "15m" # stop efter 15 min uden shell/exec-aktivitet
auto_delete = "1h" # slet 1 time efter containeren stoppede
max_lifetime = "24h" # stop senest 24 timer efter oprettelse
[labels]
workspace = "ws-42"
kind = "crawler"
Varigheder skrives som 90s, 15m, 2h, 1d eller sekunder. 0 betyder aldrig. De samme felter findes som flag på deploy:
nordkraft deploy python:3.12 --command "python worker.py" \
--restart never --auto-stop 15m --auto-delete 1h \
--label workspace=ws-42
Hvad der sker, og hvornår:
| Timer | Tæller fra | Handling |
|---|---|---|
auto_stop | seneste shell/exec-session, ellers containerens start | stop (0 kr. compute, volume bevares) |
max_lifetime | oprettelse | stop |
auto_delete | containeren stoppede | slet container og volume |
En stoppet container koster ingen compute; auto_delete er til sandboxes der ikke skal komme tilbage. Noden tjekker hvert 30. sekund, så en timer kan udløse op til 30 sekunder sent.
Labels
Labels er frie nøgle/værdi-par som du selv bestemmer over. De vises i nordkraft list og kan bruges til at filtrere:
Det er sådan en orkestrator finder "sine" containere igen.
Vent på at et job bliver færdigt
nordkraft deploy alpine --command "sh -c 'do-work; exit 3'" --restart never --auto-delete 1h
nordkraft wait app-1234 # blokerer til processen slutter, exit 3
wait returnerer containerens exit-kode (124 hvis --timeout løber ud først). Sæt restart = "never" på jobs — ellers starter platformen dem igen.
For orkestratorer (Mastra, Daytona-stil)
Begreberne er valgt så de passer direkte på hvad en sandbox-orkestrator forventer: create → POST /containers/deploy med lifecycle og labels, exec → POST /containers/{id}/exec, stop/destroy → de eksisterende endpoints, wait → POST /containers/{id}/wait, og en interaktiv terminal → WebSocket på /containers/{id}/stream. Se API-referencen.