Aller au contenu

Développement local

Cette page est destinée aux développeurs qui souhaitent cloner le dépôt, compiler l’image localement ou personnaliser le Dockerfile. Si vous souhaitez simplement utiliser le conteneur pré-compilé, consultez Prise en main.

Fenêtre de terminal
git clone https://github.com/f5-sales-demo/devcontainer.git
cd devcontainer
.
├── Dockerfile # Multi-stage image build
├── docker-compose.yml # Base compose — pulls pre-built image
├── docker-compose.build.yml # Build override — use explicitly with -f
├── .devcontainer/ # VS Code Dev Container config
│ └── devcontainer.json
├── entrypoint.sh # Container startup script
├── .env.example # Example environment variables
├── docs/ # Documentation site (Starlight)
├── claude-config/ # Claude Code configuration files
├── codex-config/ # Codex configuration
├── pi-config/ # Pi configuration
└── omp-config/ # Oh-My-Pi (omp) configuration

Le fichier docker-compose.build.yml ajoute le support de compilation locale. Il n’est pas fusionné automatiquement — vous devez le passer explicitement avec les drapeaux -f. Cela signifie que docker compose up -d (ou podman-compose up -d) récupère toujours l’image pré-compilée depuis GHCR, que vous ayez cloné le dépôt ou non.

Vous pouvez vérifier qu’un simple docker compose up utilise uniquement l’image pré-compilée (pas de contexte build:) :

Fenêtre de terminal
docker compose config

Comparez avec la configuration de compilation explicite :

Fenêtre de terminal
docker compose -f docker-compose.yml -f docker-compose.build.yml config
Fenêtre de terminal
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build

Ceci fusionne le fichier de compilation avec le fichier compose de base, compile l’image à partir du Dockerfile local et démarre le conteneur. Le drapeau --build force une recompilation même si une image en cache existe.

Le Dockerfile utilise une compilation en deux étapes optimisée pour la mise en cache des couches Docker :

Ces couches ne sont recompilées que lorsqu’un ARG de version est mis à jour ou que les paquets APT changent. Lors de modifications portant uniquement sur les outils, BuildKit ignore entièrement cette étape.

SectionContenu
1. Dépôts APTNodeSource, deadsnakes, HashiCorp, GitHub, Docker, Microsoft, Google Cloud, Dart SDK
2. Paquets APTOutils système, Node.js, Python, Java, Terraform, GitHub CLI, moteur Docker, Azure CLI, PowerShell, locales
2b. Paquets APT de sécuritéAnalyse réseau, scanners web, outils de mots de passe, rétro-ingénierie, forensique (~80 paquets)
3. Bootstrap PythonLiens symboliques + pip via get-pip.py
4. GoArchive officielle (dernière version stable, résolue au moment de la compilation)
5. Rustrustup (à l’échelle du système, dernière version stable)
6. Maven + GradleTéléchargements binaires vers /opt
7. Pile VNCXvfb, x11vnc, noVNC, fluxbox — affichage distant via navigateur
8. Nerd FontsJetBrainsMono, Hack, FiraCode (dernières versions)

Étape 2 : final (outils volatils + configuration utilisateur, ~1,5 Go)

Section intitulée « Étape 2 : final (outils volatils + configuration utilisateur, ~1,5 Go) »

Ces couches changent plus fréquemment (mises à jour npm/pip, changements de configuration) mais se recompilent rapidement car l’étape lourde deps est en cache.

SectionContenu
9. AWS CLI v2Installateur officiel
10. Outils binaireskubectl, helm, tflint, terraform-docs, act, actionlint, yt-dlp, uv
10b. Binaires supplémentairesVS Code CLI, oc, yq, terragrunt, ibmcloud, fzf, hadolint, codex
10c. Binaires Super-lintershfmt, gitleaks, editorconfig-checker, trivy, clj-kondo, dotenv-linter, golangci-lint, goreleaser, kubeconform, protolint, scalafmt, ktlint
10d. Outils Java JARcheckstyle, google-java-format (scripts enveloppeurs)
10e. Linters PHPphpcs, phpstan, psalm (téléchargements PHAR)
10f. Modules PowerShellPSScriptAnalyzer, arm-ttk
10g. Binaires de sécuriténuclei, subfinder, httpx, ffuf, gobuster, feroxbuster, dalfox, amass, trufflehog, grype, syft, bettercap (amd64)
10h. OWASP ZAPScanner d’applications web basé sur Java
10i. GhidraFramework de rétro-ingénierie
10j. MetasploitFramework d’exploitation (amd64 uniquement)
11. Outils npm globauxclaude-code, prettier, markdownlint-cli2, devcontainers-cli, playwright, pi-coding-agent, oh-my-pi
12. Outils pippre-commit, ansible, black, pylint, yamllint, playwright
12c. Linters Rubyrubocop + extensions
12e. Modules linter PerlExtensions Perl::Critic
12f. Linter Lualuacheck
12g. Linter Rlintr
12h. Gems Ruby de sécuritéwpscan, evil-winrm
12i. Outils de sécurité clonés via Gittestssl.sh, exploitdb (searchsploit), SecLists, docker-bench-security, recon-ng, spiderfoot
13. Navigateurs PlaywrightChromium + dépendances système via playwright install --with-deps
13b. Chrome DevTools MCPLien symbolique Chrome + pré-cache MCP + correctif headless
14. HomebrewLinuxbrew (dépendances assistant IA + formateurs)
15. Plugins ZSHPlugins personnalisés oh-my-zsh
16. Bootstrap shellnpm-global, tfenv, compinit
17. Configuration Claude Code + CodexMémoire de reconnaissance d’outils, politique gérée, script d’auto-test, configuration Codex
18. Point d’entréeScript de démarrage du conteneur (tout dernier COPY)

Modifiez le Dockerfile et ajoutez votre outil à la section appropriée. Recompilez après l’ajout :

Fenêtre de terminal
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build

Ou dans VS Code : Dev Containers → Recompiler le conteneur.

Ajoutez au bloc apt-get install de la section 2 :

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

Ajoutez au bloc npm install -g de la section 11 :

RUN npm install -g \
your-npm-tool

Ajoutez au bloc pip install de la section 12 :

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

Ajoutez à la section 10 ou créez une nouvelle couche RUN avec détection d’architecture :

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

L’intégration continue utilise un cache basé sur le registre — les couches de compilation sont stockées dans GHCR (ghcr.io/f5-sales-demo/devcontainer:cache-*) au lieu du cache GitHub Actions. Cela évite la limite de 10 Go du cache GHA qui provoquait des recompilations complètes fréquentes pour cette image multi-architecture d’environ 6 Go.

L’architecture en deux étapes fonctionne avec le cache de registre de sorte que :

  • Mises à jour de versions d’outils (npm, pip, outils binaires) — recompilation uniquement de l’étape final (~5 min)
  • Modifications de fichiers de configuration (claude-config/, entrypoint.sh) — recompilation uniquement des dernières couches (~1 min)
  • Modifications des fondations (paquets APT, versions Go/Rust/Java) — recompilation complète des deux étapes (~30 min)