Salta ai contenuti

Sviluppo Locale

Questa pagina è destinata agli sviluppatori che desiderano clonare il repository, compilare l’immagine localmente o personalizzare il Dockerfile. Se si desidera semplicemente utilizzare il container pre-compilato, consultare Per Iniziare.

Terminal window
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

Il file docker-compose.build.yml aggiunge il supporto per la build locale. Non viene unito automaticamente — è necessario passarlo esplicitamente con i flag -f. Ciò significa che docker compose up -d (o podman-compose up -d) scarica sempre l’immagine pre-compilata da GHCR, indipendentemente dal fatto che il repository sia stato clonato o meno.

È possibile verificare che un semplice docker compose up utilizzi solo l’immagine pre-compilata (nessun contesto build:):

Terminal window
docker compose config

Confrontare con la configurazione di build esplicita:

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

Questo unisce il file di build con il file compose di base, compila l’immagine dal Dockerfile locale e avvia il container. Il flag --build forza una ricompilazione anche se esiste un’immagine in cache.

Il Dockerfile utilizza una build a due stadi ottimizzata per il caching dei layer Docker:

Questi layer vengono ricompilati solo quando viene aggiornato un ARG di versione o cambiano i pacchetti APT. In caso di modifiche limitate agli strumenti, BuildKit salta interamente questo stadio.

SezioneContenuti
1. Repository APTNodeSource, deadsnakes, HashiCorp, GitHub, Docker, Microsoft, Google Cloud, Dart SDK
2. Pacchetti APTStrumenti di sistema, Node.js, Python, Java, Terraform, GitHub CLI, Docker engine, Azure CLI, PowerShell, locali
2b. Pacchetti APT di sicurezzaAnalisi di rete, scanner web, strumenti per password, reverse engineering, informatica forense (~80 pacchetti)
3. Bootstrap PythonSymlink + pip tramite get-pip.py
4. GoTarball ufficiale (ultima versione stabile, risolta al momento della build)
5. Rustrustup (a livello di sistema, ultima versione stabile)
6. Maven + GradleDownload binari in /opt
7. Stack VNCXvfb, x11vnc, noVNC, fluxbox — display remoto tramite browser
8. Nerd FontsJetBrainsMono, Hack, FiraCode (ultime release)

Stadio 2: final (strumenti volatili + configurazione utente, ~1,5 GB)

Sezione intitolata “Stadio 2: final (strumenti volatili + configurazione utente, ~1,5 GB)”

Questi layer cambiano più frequentemente (aggiornamenti npm/pip, modifiche alla configurazione) ma si ricompilano rapidamente perché lo stadio pesante deps è in cache.

SezioneContenuti
9. AWS CLI v2Installer ufficiale
10. Strumenti binarikubectl, helm, tflint, terraform-docs, act, actionlint, yt-dlp, uv
10b. Binari aggiuntiviVS Code CLI, oc, yq, terragrunt, ibmcloud, fzf, hadolint, codex
10c. Binari super-lintershfmt, gitleaks, editorconfig-checker, trivy, clj-kondo, dotenv-linter, golangci-lint, goreleaser, kubeconform, protolint, scalafmt, ktlint
10d. Strumenti Java JARcheckstyle, google-java-format (script wrapper)
10e. Linter PHPphpcs, phpstan, psalm (download PHAR)
10f. Moduli PowerShellPSScriptAnalyzer, arm-ttk
10g. Binari di sicurezzanuclei, subfinder, httpx, ffuf, gobuster, feroxbuster, dalfox, amass, trufflehog, grype, syft, bettercap (amd64)
10h. OWASP ZAPScanner di applicazioni web basato su Java
10i. GhidraFramework di reverse engineering
10j. MetasploitFramework di exploitation (solo amd64)
11. Strumenti npm globaliclaude-code, prettier, markdownlint-cli2, devcontainers-cli, playwright, pi-coding-agent, oh-my-pi
12. Strumenti pippre-commit, ansible, black, pylint, yamllint, playwright
12c. Linter Rubyrubocop + estensioni
12e. Moduli linter PerlEstensioni Perl::Critic
12f. Linter Lualuacheck
12g. Linter Rlintr
12h. Gem Ruby di sicurezzawpscan, evil-winrm
12i. Strumenti di sicurezza clonati da Gittestssl.sh, exploitdb (searchsploit), SecLists, docker-bench-security, recon-ng, spiderfoot
13. Browser PlaywrightChromium + dipendenze di sistema tramite playwright install --with-deps
13b. Chrome DevTools MCPSymlink Chrome + pre-cache MCP + patch headless
14. HomebrewLinuxbrew (dipendenze assistente AI + formattatori)
15. Plugin ZSHPlugin personalizzati oh-my-zsh
16. Bootstrap shellnpm-global, tfenv, compinit
17. Configurazione Claude Code + CodexMemoria di consapevolezza strumenti, policy gestita, script di auto-test, configurazione Codex
18. EntrypointScript di avvio del container (ultimo COPY in assoluto)

Modificare il Dockerfile e aggiungere lo strumento alla sezione appropriata. Ricompilare dopo l’aggiunta:

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

Oppure in VS Code: Dev Containers → Ricompila Container.

Aggiungere al blocco apt-get install della sezione 2:

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

Aggiungere al blocco npm install -g della sezione 11:

RUN npm install -g \
your-npm-tool

Aggiungere al blocco pip install della sezione 12:

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

Aggiungere alla sezione 10 o creare un nuovo layer RUN con rilevamento dell’architettura:

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

La CI utilizza il caching basato su registry — i layer di build sono memorizzati in GHCR (ghcr.io/f5-sales-demo/devcontainer:cache-*) invece che nella cache di GitHub Actions. Questo evita il limite di 10 GB della cache GHA che causava frequenti ricompilazioni complete per questa immagine multi-architettura di ~6 GB.

L’architettura a due stadi funziona con la cache del registry in modo che:

  • Aggiornamenti di versione degli strumenti (npm, pip, strumenti binari) — ricompila solo lo stadio final (~5 min)
  • Modifiche ai file di configurazione (claude-config/, entrypoint.sh) — ricompila solo gli ultimi layer (~1 min)
  • Modifiche alle fondamenta (pacchetti APT, versioni Go/Rust/Java) — ricompilazione completa di entrambi gli stadi (~30 min)