Ir al contenido

Desarrollo Local

Esta página está dirigida a desarrolladores que desean clonar el repositorio, compilar la imagen localmente o personalizar el Dockerfile. Si solo desea utilizar el contenedor precompilado, consulte Primeros Pasos.

Ventana 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

El archivo docker-compose.build.yml añade soporte de compilación local. No se fusiona automáticamente — debe pasarlo explícitamente con las flags -f. Esto significa que docker compose up -d (o podman-compose up -d) siempre descarga la imagen precompilada de GHCR, independientemente de si clonó el repositorio o no.

Puede verificar que un simple docker compose up utiliza únicamente la imagen precompilada (sin contexto build:):

Ventana de terminal
docker compose config

Compare con la configuración de compilación explícita:

Ventana de terminal
docker compose -f docker-compose.yml -f docker-compose.build.yml config
Ventana de terminal
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build

Esto fusiona el archivo de compilación con el archivo compose base, compila la imagen desde el Dockerfile local e inicia el contenedor. La flag --build fuerza una recompilación incluso si existe una imagen en caché.

El Dockerfile utiliza una compilación en dos etapas optimizada para el caché de capas de Docker:

Estas capas solo se recompilan cuando se actualiza un ARG de versión o cambian los paquetes APT. En cambios típicos solo de herramientas, BuildKit omite esta etapa completa.

SecciónContenido
1. Repositorios APTNodeSource, deadsnakes, HashiCorp, GitHub, Docker, Microsoft, Google Cloud, Dart SDK
2. Paquetes APTHerramientas del sistema, Node.js, Python, Java, Terraform, GitHub CLI, Docker engine, Azure CLI, PowerShell, locales
2b. Paquetes APT de seguridadAnálisis de red, escáneres web, herramientas de contraseñas, ingeniería inversa, análisis forense (~80 paquetes)
3. Bootstrap de PythonSymlinks + pip mediante get-pip.py
4. GoTarball oficial (última versión estable, resuelta en tiempo de compilación)
5. Rustrustup (a nivel de sistema, última versión estable)
6. Maven + GradleDescargas de binarios a /opt
7. Pila VNCXvfb, x11vnc, noVNC, fluxbox — visualización remota mediante navegador
8. Nerd FontsJetBrainsMono, Hack, FiraCode (últimas versiones)

Etapa 2: final (herramientas volátiles + configuración de usuario, ~1.5 GB)

Sección titulada «Etapa 2: final (herramientas volátiles + configuración de usuario, ~1.5 GB)»

Estas capas cambian con más frecuencia (actualizaciones de npm/pip, cambios de configuración) pero se recompilan rápidamente porque la etapa pesada deps está en caché.

SecciónContenido
9. AWS CLI v2Instalador oficial
10. Herramientas binariaskubectl, helm, tflint, terraform-docs, act, actionlint, yt-dlp, uv
10b. Binarios adicionalesVS Code CLI, oc, yq, terragrunt, ibmcloud, fzf, hadolint, codex
10c. Binarios de super-lintershfmt, gitleaks, editorconfig-checker, trivy, clj-kondo, dotenv-linter, golangci-lint, goreleaser, kubeconform, protolint, scalafmt, ktlint
10d. Herramientas JAR de Javacheckstyle, google-java-format (scripts wrapper)
10e. Linters de PHPphpcs, phpstan, psalm (descargas PHAR)
10f. Módulos de PowerShellPSScriptAnalyzer, arm-ttk
10g. Binarios de seguridadnuclei, subfinder, httpx, ffuf, gobuster, feroxbuster, dalfox, amass, trufflehog, grype, syft, bettercap (amd64)
10h. OWASP ZAPEscáner de aplicaciones web basado en Java
10i. GhidraFramework de ingeniería inversa
10j. MetasploitFramework de explotación (solo amd64)
11. Herramientas npm globalesclaude-code, prettier, markdownlint-cli2, devcontainers-cli, playwright, pi-coding-agent, oh-my-pi
12. Herramientas pippre-commit, ansible, black, pylint, yamllint, playwright
12c. Linters de Rubyrubocop + extensiones
12e. Módulos de linter de PerlExtensiones de Perl::Critic
12f. Linter de Lualuacheck
12g. Linter de Rlintr
12h. Gemas Ruby de seguridadwpscan, evil-winrm
12i. Herramientas de seguridad clonadas con Gittestssl.sh, exploitdb (searchsploit), SecLists, docker-bench-security, recon-ng, spiderfoot
13. Navegadores PlaywrightChromium + dependencias del sistema mediante playwright install --with-deps
13b. Chrome DevTools MCPSymlink de Chrome + pre-caché MCP + parche headless
14. HomebrewLinuxbrew (dependencias de asistentes IA + formateadores)
15. Plugins de ZSHPlugins personalizados de oh-my-zsh
16. Bootstrap del shellnpm-global, tfenv, compinit
17. Configuración de Claude Code + CodexMemoria de reconocimiento de herramientas, política gestionada, script de autotest, configuración de Codex
18. EntrypointScript de inicio del contenedor (último COPY absoluto)

Edite el Dockerfile y añada su herramienta en la sección correspondiente. Recompile después de agregar:

Ventana de terminal
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build

O en VS Code: Dev Containers → Recompilar Contenedor.

Añada al bloque apt-get install de la sección 2:

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

Añada al bloque npm install -g de la sección 11:

RUN npm install -g \
your-npm-tool

Añada al bloque pip install de la sección 12:

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

Añada a la sección 10 o cree una nueva capa RUN con detección de arquitectura:

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

CI utiliza caché basado en registro — las capas de compilación se almacenan en GHCR (ghcr.io/f5-sales-demo/devcontainer:cache-*) en lugar del caché de GitHub Actions. Esto evita el límite de 10 GB del caché de GHA que causaba recompilaciones completas frecuentes para esta imagen multi-arquitectura de ~6 GB.

La arquitectura de dos etapas funciona con el caché de registro de modo que:

  • Actualizaciones de versión de herramientas (npm, pip, herramientas binarias) — recompila solo la etapa final (~5 min)
  • Cambios en archivos de configuración (claude-config/, entrypoint.sh) — recompila solo las últimas capas (~1 min)
  • Cambios en las bases (paquetes APT, versiones de Go/Rust/Java) — recompilación completa de ambas etapas (~30 min)