Pular para o conteúdo

Desenvolvimento Local

Esta página é para desenvolvedores que desejam clonar o repositório, compilar a imagem localmente ou personalizar o Dockerfile. Se você apenas deseja usar o container pré-compilado, consulte Primeiros Passos.

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

O arquivo docker-compose.build.yml adiciona suporte a build local. Ele não é mesclado automaticamente — você deve passá-lo explicitamente com as flags -f. Isso significa que docker compose up -d (ou podman-compose up -d) sempre puxa a imagem pré-compilada do GHCR, independentemente de você ter clonado o repositório ou não.

Você pode verificar que um simples docker compose up usa apenas a imagem pré-compilada (sem contexto build:):

Terminal window
docker compose config

Compare com a configuração explícita de build:

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

Isso mescla o arquivo de build com o arquivo compose base, compila a imagem a partir do Dockerfile local e inicia o container. A flag --build força uma recompilação mesmo se uma imagem em cache existir.

O Dockerfile usa um build em dois estágios otimizado para cache de camadas do Docker:

Essas camadas só são recompiladas quando um ARG de versão é atualizado ou os pacotes APT mudam. Em alterações típicas apenas de ferramentas, o BuildKit pula este estágio inteiro.

SeçãoConteúdo
1. Repositórios APTNodeSource, deadsnakes, HashiCorp, GitHub, Docker, Microsoft, Google Cloud, Dart SDK
2. Pacotes APTFerramentas de sistema, Node.js, Python, Java, Terraform, GitHub CLI, Docker engine, Azure CLI, PowerShell, locales
2b. Pacotes APT de segurançaAnálise de rede, scanners web, ferramentas de senha, engenharia reversa, forense (~80 pacotes)
3. Bootstrap do PythonSymlinks + pip via get-pip.py
4. GoTarball oficial (última versão estável, resolvida no momento do build)
5. Rustrustup (instalação global, última versão estável)
6. Maven + GradleDownloads binários para /opt
7. Stack VNCXvfb, x11vnc, noVNC, fluxbox — exibição remota via navegador
8. Nerd FontsJetBrainsMono, Hack, FiraCode (últimas versões)

Estágio 2: final (ferramentas voláteis + configuração do usuário, ~1,5 GB)

Seção intitulada “Estágio 2: final (ferramentas voláteis + configuração do usuário, ~1,5 GB)”

Essas camadas mudam com mais frequência (atualizações npm/pip, alterações de configuração), mas recompilam rapidamente porque o estágio pesado deps está em cache.

SeçãoConteúdo
9. AWS CLI v2Instalador oficial
10. Ferramentas bináriaskubectl, helm, tflint, terraform-docs, act, actionlint, yt-dlp, uv
10b. Binários adicionaisVS Code CLI, oc, yq, terragrunt, ibmcloud, fzf, hadolint, codex
10c. Binários do Super-lintershfmt, gitleaks, editorconfig-checker, trivy, clj-kondo, dotenv-linter, golangci-lint, goreleaser, kubeconform, protolint, scalafmt, ktlint
10d. Ferramentas Java JARcheckstyle, google-java-format (scripts wrapper)
10e. Linters PHPphpcs, phpstan, psalm (downloads PHAR)
10f. Módulos PowerShellPSScriptAnalyzer, arm-ttk
10g. Binários de segurançanuclei, subfinder, httpx, ffuf, gobuster, feroxbuster, dalfox, amass, trufflehog, grype, syft, bettercap (amd64)
10h. OWASP ZAPScanner de aplicações web baseado em Java
10i. GhidraFramework de engenharia reversa
10j. MetasploitFramework de exploração (apenas amd64)
11. Ferramentas npm globaisclaude-code, prettier, markdownlint-cli2, devcontainers-cli, playwright, pi-coding-agent, oh-my-pi
12. Ferramentas pippre-commit, ansible, black, pylint, yamllint, playwright
12c. Linters Rubyrubocop + extensões
12e. Módulos linter PerlExtensões Perl::Critic
12f. Linter Lualuacheck
12g. Linter Rlintr
12h. Gems Ruby de segurançawpscan, evil-winrm
12i. Ferramentas de segurança clonadas via Gittestssl.sh, exploitdb (searchsploit), SecLists, docker-bench-security, recon-ng, spiderfoot
13. Navegadores PlaywrightChromium + dependências do sistema via playwright install --with-deps
13b. Chrome DevTools MCPSymlink do Chrome + pré-cache MCP + patch headless
14. HomebrewLinuxbrew (dependências de assistente IA + formatadores)
15. Plugins ZSHPlugins personalizados do oh-my-zsh
16. Bootstrap do shellnpm-global, tfenv, compinit
17. Configuração Claude Code + CodexMemória de reconhecimento de ferramentas, política gerenciada, script de autoteste, configuração Codex
18. EntrypointScript de inicialização do container (último COPY absoluto)

Edite o Dockerfile e adicione sua ferramenta à seção apropriada. Recompile após adicionar:

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

Ou no VS Code: Dev Containers → Recompilar Container.

Adicione ao bloco apt-get install da seção 2:

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

Adicione ao bloco npm install -g da seção 11:

RUN npm install -g \
your-npm-tool

Adicione ao bloco pip install da seção 12:

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

Adicione à seção 10 ou crie uma nova camada RUN com detecção de arquitetura:

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

O CI usa cache baseado em registro — as camadas de build são armazenadas no GHCR (ghcr.io/f5-sales-demo/devcontainer:cache-*) em vez do cache do GitHub Actions. Isso evita o limite de 10 GB do cache GHA que causava recompilações completas frequentes para esta imagem multi-arquitetura de ~6 GB.

A arquitetura em dois estágios funciona com o cache de registro de forma que:

  • Atualizações de versão de ferramentas (npm, pip, ferramentas binárias) — recompila apenas o estágio final (~5 min)
  • Alterações em arquivos de configuração (claude-config/, entrypoint.sh) — recompila apenas as últimas camadas (~1 min)
  • Alterações de fundação (pacotes APT, versões Go/Rust/Java) — recompilação completa de ambos os estágios (~30 min)