Zum Inhalt springen

Lokale Entwicklung

Diese Seite richtet sich an Entwickler, die das Repository klonen, das Image lokal bauen oder das Dockerfile anpassen möchten. Wenn Sie lediglich den vorgefertigten Container verwenden möchten, siehe Erste Schritte.

Terminal-Fenster
git clone https://github.com/f5-sales-demo/devcontainer.git
cd devcontainer
.
├── Dockerfile # Multi-Stage Image-Build
├── docker-compose.yml # Basis-Compose — bezieht vorgefertigtes Image
├── docker-compose.build.yml # Build-Override — explizit mit -f verwenden
├── .devcontainer/ # VS Code Dev Container Konfiguration
│ └── devcontainer.json
├── entrypoint.sh # Container-Startskript
├── .env.example # Beispiel-Umgebungsvariablen
├── docs/ # Dokumentationsseite (Starlight)
├── claude-config/ # Claude Code Konfigurationsdateien
├── codex-config/ # Codex-Konfiguration
├── pi-config/ # Pi-Konfiguration
└── omp-config/ # Oh-My-Pi (omp) Konfiguration

Die Datei docker-compose.build.yml fügt lokale Build-Unterstützung hinzu. Sie wird nicht automatisch zusammengeführt — Sie müssen sie explizit mit -f-Flags angeben. Das bedeutet, docker compose up -d (oder podman-compose up -d) bezieht immer das vorgefertigte Image von GHCR, unabhängig davon, ob Sie das Repository geklont haben oder nicht.

Sie können überprüfen, dass ein einfaches docker compose up nur das vorgefertigte Image verwendet (kein build:-Kontext):

Terminal-Fenster
docker compose config

Vergleichen Sie mit der expliziten Build-Konfiguration:

Terminal-Fenster
docker compose -f docker-compose.yml -f docker-compose.build.yml config
Terminal-Fenster
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build

Dies führt die Build-Datei mit der Basis-Compose-Datei zusammen, baut das Image aus dem lokalen Dockerfile und startet den Container. Das --build-Flag erzwingt einen Neubau, auch wenn ein zwischengespeichertes Image existiert.

Das Dockerfile verwendet einen zweistufigen Build, der für Docker-Layer-Caching optimiert ist:

Diese Layer werden nur neu gebaut, wenn ein Versions-ARG aktualisiert wird oder sich APT-Pakete ändern. Bei typischen Änderungen an Tools überspringt BuildKit diese gesamte Stufe.

AbschnittInhalt
1. APT-ReposNodeSource, deadsnakes, HashiCorp, GitHub, Docker, Microsoft, Google Cloud, Dart SDK
2. APT-PaketeSystemwerkzeuge, Node.js, Python, Java, Terraform, GitHub CLI, Docker Engine, Azure CLI, PowerShell, Locales
2b. Sicherheits-APT-PaketeNetzwerkanalyse, Web-Scanner, Passwort-Tools, Reverse Engineering, Forensik (~80 Pakete)
3. Python-BootstrapSymlinks + pip über get-pip.py
4. GoOffizieller Tarball (neueste stabile Version, zur Build-Zeit aufgelöst)
5. Rustrustup (systemweit, neueste stabile Version)
6. Maven + GradleBinäre Downloads nach /opt
7. VNC-StackXvfb, x11vnc, noVNC, fluxbox — Remote-Anzeige über Browser
8. Nerd FontsJetBrainsMono, Hack, FiraCode (neueste Releases)

Stufe 2: final (veränderliche Tools + Benutzereinrichtung, ~1,5 GB)

Abschnitt betitelt „Stufe 2: final (veränderliche Tools + Benutzereinrichtung, ~1,5 GB)“

Diese Layer ändern sich häufiger (npm/pip-Updates, Konfigurationsänderungen), werden aber schnell neu gebaut, da die umfangreiche deps-Stufe zwischengespeichert ist.

AbschnittInhalt
9. AWS CLI v2Offizieller Installer
10. Binäre Toolskubectl, helm, tflint, terraform-docs, act, actionlint, yt-dlp, uv
10b. Zusätzliche BinärdateienVS Code CLI, oc, yq, terragrunt, ibmcloud, fzf, hadolint, codex
10c. Super-Linter-Binärdateienshfmt, gitleaks, editorconfig-checker, trivy, clj-kondo, dotenv-linter, golangci-lint, goreleaser, kubeconform, protolint, scalafmt, ktlint
10d. Java-JAR-Toolscheckstyle, google-java-format (Wrapper-Skripte)
10e. PHP-Linterphpcs, phpstan, psalm (PHAR-Downloads)
10f. PowerShell-ModulePSScriptAnalyzer, arm-ttk
10g. Sicherheits-Binärdateiennuclei, subfinder, httpx, ffuf, gobuster, feroxbuster, dalfox, amass, trufflehog, grype, syft, bettercap (amd64)
10h. OWASP ZAPJava-basierter Webanwendungs-Scanner
10i. GhidraReverse-Engineering-Framework
10j. MetasploitExploitation-Framework (nur amd64)
11. Globale npm-Toolsclaude-code, prettier, markdownlint-cli2, devcontainers-cli, playwright, pi-coding-agent, oh-my-pi
12. pip-Toolspre-commit, ansible, black, pylint, yamllint, playwright
12c. Ruby-Linterrubocop + Erweiterungen
12e. Perl-Linter-ModulePerl::Critic-Erweiterungen
12f. Lua-Linterluacheck
12g. R-Linterlintr
12h. Sicherheits-Ruby-Gemswpscan, evil-winrm
12i. Git-geklonte Sicherheitstoolstestssl.sh, exploitdb (searchsploit), SecLists, docker-bench-security, recon-ng, spiderfoot
13. Playwright-BrowserChromium + Systemabhängigkeiten über playwright install --with-deps
13b. Chrome DevTools MCPChrome-Symlink + MCP-Pre-Cache + Headless-Patch
14. HomebrewLinuxbrew (KI-Assistenten-Abhängigkeiten + Formatierer)
15. ZSH-Pluginsoh-my-zsh benutzerdefinierte Plugins
16. Shell-Bootstrapnpm-global, tfenv, compinit
17. Claude Code + Codex-KonfigurationTool-Awareness-Speicher, verwaltete Richtlinie, Selbsttest-Skript, Codex-Konfiguration
18. EntrypointContainer-Startskript (absolut letztes COPY)

Bearbeiten Sie das Dockerfile und fügen Sie Ihr Tool dem entsprechenden Abschnitt hinzu. Bauen Sie nach dem Hinzufügen neu:

Terminal-Fenster
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build

Oder in VS Code: Dev Containers → Container neu erstellen.

Fügen Sie zum apt-get install-Block in Abschnitt 2 hinzu:

RUN apt-get update && apt-get install -y --no-install-recommends \
your-package-here \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

Fügen Sie zum npm install -g-Block in Abschnitt 11 hinzu:

RUN npm install -g \
your-npm-tool

Fügen Sie zum pip install-Block in Abschnitt 12 hinzu:

RUN pip install --no-cache-dir --break-system-packages \
your-python-tool

Fügen Sie zu Abschnitt 10 hinzu oder erstellen Sie einen neuen RUN-Layer mit Architekturerkennung:

RUN ARCH=$(dpkg --print-architecture) \
&& curl -fsSL "https://example.com/tool-linux-${ARCH}.tar.gz" \
| tar -xz -C /usr/local/bin tool

CI verwendet Registry-basiertes Caching — Build-Layer werden in GHCR (ghcr.io/f5-sales-demo/devcontainer:cache-*) gespeichert, anstatt im GitHub Actions Cache. Dies vermeidet das 10 GB GHA-Cache-Limit, das bei diesem ~6 GB großen Multi-Architektur-Image häufige vollständige Neubauten verursachte.

Die zweistufige Architektur funktioniert mit dem Registry-Cache folgendermaßen:

  • Tool-Versionserhöhungen (npm, pip, binäre Tools) — nur die final-Stufe wird neu gebaut (~5 Min.)
  • Konfigurationsdatei-Änderungen (claude-config/, entrypoint.sh) — nur die letzten Layer werden neu gebaut (~1 Min.)
  • Grundlagen-Änderungen (APT-Pakete, Go/Rust/Java-Versionen) — vollständiger Neubau beider Stufen (~30 Min.)