콘텐츠로 이동

로컬 개발

이 페이지는 저장소를 클론하거나, 이미지를 로컬에서 빌드하거나, Dockerfile을 커스터마이즈하려는 개발자를 위한 페이지입니다. 사전 빌드된 컨테이너를 사용하기만 하려면 시작하기를 참조하세요.

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

docker-compose.build.yml 파일은 로컬 빌드 지원을 추가합니다. 이 파일은 자동으로 병합되지 않으며-f 플래그를 사용하여 명시적으로 전달해야 합니다. 이는 저장소를 클론했는지 여부에 관계없이 docker compose up -d(또는 podman-compose up -d)가 항상 GHCR에서 사전 빌드된 이미지를 풀링한다는 것을 의미합니다.

일반 docker compose up이 사전 빌드된 이미지만 사용하는지(build: 컨텍스트 없이) 확인할 수 있습니다:

Terminal window
docker compose config

명시적 빌드 구성과 비교하세요:

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

이 명령은 빌드 파일을 기본 compose 파일과 병합하고, 로컬 Dockerfile에서 이미지를 빌드한 후 컨테이너를 시작합니다. --build 플래그는 캐시된 이미지가 존재하더라도 강제로 재빌드합니다.

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. Rustrustup (시스템 전역, 최신 안정 버전)
6. Maven + Gradle/opt에 바이너리 다운로드
7. VNC 스택Xvfb, x11vnb, noVNC, fluxbox — 브라우저를 통한 원격 디스플레이
8. Nerd FontsJetBrainsMono, 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 ZAPJava 기반 웹 애플리케이션 스캐너
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 gemswpscan, 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 MCPChrome 심볼릭 링크 + MCP 사전 캐시 + 헤드리스 패치
14. HomebrewLinuxbrew (AI 어시스턴트 의존성 + 포매터)
15. ZSH 플러그인oh-my-zsh 커스텀 플러그인
16. 셸 부트스트랩npm-global, tfenv, compinit
17. Claude Code + Codex 설정도구 인식 메모리, 관리형 정책, 자체 테스트 스크립트, Codex 설정
18. 엔트리포인트컨테이너 시작 스크립트 (절대적으로 마지막 COPY)

Dockerfile을 편집하고 적절한 섹션에 도구를 추가하세요. 추가 후 재빌드합니다:

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

또는 VS Code에서: Dev Containers → Rebuild Container.

섹션 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/*

섹션 11의 npm install -g 블록에 추가하세요:

RUN npm install -g \
your-npm-tool

섹션 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분)