로컬 개발
이 페이지는 저장소를 클론하거나, 이미지를 로컬에서 빌드하거나, Dockerfile을 커스터마이즈하려는 개발자를 위한 페이지입니다. 사전 빌드된 컨테이너를 사용하기만 하려면 시작하기를 참조하세요.
저장소 클론
섹션 제목: “저장소 클론”git clone https://github.com/f5-sales-demo/devcontainer.gitcd 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빌드 파일
섹션 제목: “빌드 파일”docker-compose.build.yml 파일은 로컬 빌드 지원을 추가합니다. 이 파일은 자동으로 병합되지 않으며 — -f 플래그를 사용하여 명시적으로 전달해야 합니다. 이는 저장소를 클론했는지 여부에 관계없이 docker compose up -d(또는 podman-compose up -d)가 항상 GHCR에서 사전 빌드된 이미지를 풀링한다는 것을 의미합니다.
일반 docker compose up이 사전 빌드된 이미지만 사용하는지(build: 컨텍스트 없이) 확인할 수 있습니다:
docker compose config명시적 빌드 구성과 비교하세요:
docker compose -f docker-compose.yml -f docker-compose.build.yml config일반 podman-compose up이 사전 빌드된 이미지만 사용하는지(build: 컨텍스트 없이) 확인할 수 있습니다:
podman-compose config명시적 빌드 구성과 비교하세요:
podman-compose -f docker-compose.yml -f docker-compose.build.yml config로컬 빌드
섹션 제목: “로컬 빌드”docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --buildpodman-compose -f docker-compose.yml -f docker-compose.build.yml up -d --build이 명령은 빌드 파일을 기본 compose 파일과 병합하고, 로컬 Dockerfile에서 이미지를 빌드한 후 컨테이너를 시작합니다. --build 플래그는 캐시된 이미지가 존재하더라도 강제로 재빌드합니다.
2단계 빌드 아키텍처
섹션 제목: “2단계 빌드 아키텍처”Dockerfile은 Docker 레이어 캐싱에 최적화된 2단계 빌드를 사용합니다:
1단계: deps (안정적인 기반, ~4.5 GB)
섹션 제목: “1단계: deps (안정적인 기반, ~4.5 GB)”이 레이어들은 버전 ARG가 변경되거나 APT 패키지가 변경될 때만 재빌드됩니다. 일반적인 도구 전용 변경 시 BuildKit은 이 전체 단계를 건너뜁니다.
| 섹션 | 내용 |
|---|---|
| 1. APT 저장소 | NodeSource, deadsnakes, HashiCorp, GitHub, Docker, Microsoft, Google Cloud, Dart SDK |
| 2. APT 패키지 | 시스템 도구, Node.js, Python, Java, Terraform, GitHub CLI, Docker 엔진, Azure CLI, PowerShell, 로케일 |
| 2b. 보안 APT 패키지 | 네트워크 분석, 웹 스캐너, 비밀번호 도구, 리버스 엔지니어링, 포렌식 (~80개 패키지) |
| 3. Python 부트스트랩 | 심볼릭 링크 + get-pip.py를 통한 pip |
| 4. Go | 공식 타르볼 (빌드 시점에 해결되는 최신 안정 버전) |
| 5. Rust | rustup (시스템 전역, 최신 안정 버전) |
| 6. Maven + Gradle | /opt에 바이너리 다운로드 |
| 7. VNC 스택 | Xvfb, x11vnb, noVNC, fluxbox — 브라우저를 통한 원격 디스플레이 |
| 8. Nerd Fonts | JetBrainsMono, Hack, FiraCode (최신 릴리스) |
2단계: final (변동이 잦은 도구 + 사용자 설정, ~1.5 GB)
섹션 제목: “2단계: final (변동이 잦은 도구 + 사용자 설정, ~1.5 GB)”이 레이어들은 더 자주 변경되지만(npm/pip 업데이트, 설정 변경) 무거운 deps 단계가 캐시되어 있어 빠르게 재빌드됩니다.
| 섹션 | 내용 |
|---|---|
| 9. AWS CLI v2 | 공식 설치 프로그램 |
| 10. 바이너리 도구 | kubectl, helm, tflint, terraform-docs, act, actionlint, yt-dlp, uv |
| 10b. 추가 바이너리 | VS Code CLI, oc, yq, terragrunt, ibmcloud, fzf, hadolint, codex |
| 10c. Super-linter 바이너리 | shfmt, gitleaks, editorconfig-checker, trivy, clj-kondo, dotenv-linter, golangci-lint, goreleaser, kubeconform, protolint, scalafmt, ktlint |
| 10d. Java JAR 도구 | checkstyle, google-java-format (래퍼 스크립트) |
| 10e. PHP 린터 | phpcs, phpstan, psalm (PHAR 다운로드) |
| 10f. PowerShell 모듈 | PSScriptAnalyzer, arm-ttk |
| 10g. 보안 바이너리 | nuclei, subfinder, httpx, ffuf, gobuster, feroxbuster, dalfox, amass, trufflehog, grype, syft, bettercap (amd64) |
| 10h. OWASP ZAP | Java 기반 웹 애플리케이션 스캐너 |
| 10i. Ghidra | 리버스 엔지니어링 프레임워크 |
| 10j. Metasploit | 익스플로잇 프레임워크 (amd64 전용) |
| 11. npm 전역 도구 | claude-code, prettier, markdownlint-cli2, devcontainers-cli, playwright, pi-coding-agent, oh-my-pi |
| 12. pip 도구 | pre-commit, ansible, black, pylint, yamllint, playwright |
| 12c. Ruby 린터 | rubocop + 확장 |
| 12e. Perl 린터 모듈 | Perl::Critic 확장 |
| 12f. Lua 린터 | luacheck |
| 12g. R 린터 | lintr |
| 12h. 보안 Ruby gems | wpscan, evil-winrm |
| 12i. Git 클론 보안 도구 | testssl.sh, exploitdb (searchsploit), SecLists, docker-bench-security, recon-ng, spiderfoot |
| 13. Playwright 브라우저 | Chromium + playwright install --with-deps를 통한 시스템 의존성 |
| 13b. Chrome DevTools MCP | Chrome 심볼릭 링크 + MCP 사전 캐시 + 헤드리스 패치 |
| 14. Homebrew | Linuxbrew (AI 어시스턴트 의존성 + 포매터) |
| 15. ZSH 플러그인 | oh-my-zsh 커스텀 플러그인 |
| 16. 셸 부트스트랩 | npm-global, tfenv, compinit |
| 17. Claude Code + Codex 설정 | 도구 인식 메모리, 관리형 정책, 자체 테스트 스크립트, Codex 설정 |
| 18. 엔트리포인트 | 컨테이너 시작 스크립트 (절대적으로 마지막 COPY) |
도구 추가
섹션 제목: “도구 추가”Dockerfile을 편집하고 적절한 섹션에 도구를 추가하세요. 추가 후 재빌드합니다:
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --buildpodman-compose -f docker-compose.yml -f docker-compose.build.yml up -d --build또는 VS Code에서: Dev Containers → Rebuild Container.
APT 패키지
섹션 제목: “APT 패키지”섹션 2의 apt-get install 블록에 추가하세요:
RUN apt-get update && apt-get install -y --no-install-recommends \ your-package-here \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*npm 도구
섹션 제목: “npm 도구”섹션 11의 npm install -g 블록에 추가하세요:
RUN npm install -g \ your-npm-toolpip 도구
섹션 제목: “pip 도구”섹션 12의 pip install 블록에 추가하세요:
RUN pip install --no-cache-dir --break-system-packages \ your-python-tool바이너리 다운로드
섹션 제목: “바이너리 다운로드”섹션 10에 추가하거나 아키텍처 감지가 포함된 새 RUN 레이어를 생성하세요:
RUN ARCH=$(dpkg --print-architecture) \ && curl -fsSL "https://example.com/tool-linux-${ARCH}.tar.gz" \ | tar -xz -C /usr/local/bin tool빌드 캐시
섹션 제목: “빌드 캐시”CI는 레지스트리 기반 캐싱을 사용합니다 — 빌드 레이어가 GitHub Actions 캐시 대신 GHCR(ghcr.io/f5-sales-demo/devcontainer:cache-*)에 저장됩니다. 이는 이 ~6 GB 멀티 아키텍처 이미지에서 빈번한 전체 재빌드를 유발하던 10 GB GHA 캐시 제한을 방지합니다.
2단계 아키텍처는 레지스트리 캐시와 함께 작동하여 다음과 같은 효과를 제공합니다:
- 도구 버전 업데이트 (npm, pip, 바이너리 도구) —
final단계만 재빌드 (~5분) - 설정 파일 변경 (
claude-config/,entrypoint.sh) — 마지막 몇 개 레이어만 재빌드 (~1분) - 기반 변경 (APT 패키지, Go/Rust/Java 버전) — 두 단계 모두 전체 재빌드 (~30분)