इसे छोड़कर कंटेंट पर जाएं

स्थानीय विकास

यह पेज उन डेवलपर्स के लिए है जो रिपॉजिटरी क्लोन करना, इमेज को स्थानीय रूप से बिल्ड करना, या Dockerfile को कस्टमाइज़ करना चाहते हैं। यदि आप केवल पहले से बिल्ड किए गए कंटेनर का उपयोग करना चाहते हैं, तो शुरू करना देखें।

रिपॉजिटरी क्लोन करें

Section titled “रिपॉजिटरी क्लोन करें”
Terminal window
git clone https://github.com/f5-sales-demo/devcontainer.git
cd devcontainer

प्रोजेक्ट संरचना

Section titled “प्रोजेक्ट संरचना”
.
├── 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

स्थानीय रूप से बिल्ड करना

Section titled “स्थानीय रूप से बिल्ड करना”
Terminal window
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build

यह बिल्ड फ़ाइल को बेस कंपोज़ फ़ाइल के साथ मर्ज करता है, स्थानीय Dockerfile से इमेज बिल्ड करता है, और कंटेनर शुरू करता है। --build फ्लैग कैश्ड इमेज मौजूद होने पर भी रीबिल्ड को बाध्य करता है।

दो-चरण बिल्ड आर्किटेक्चर

Section titled “दो-चरण बिल्ड आर्किटेक्चर”

Dockerfile Docker लेयर कैशिंग के लिए अनुकूलित दो-चरण बिल्ड का उपयोग करता है:

चरण 1: deps (स्थिर नींव, ~4.5 GB)

Section titled “चरण 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आधिकारिक tarball (नवीनतम स्थिर, बिल्ड समय पर रिज़ॉल्व)
5. Rustrustup (सिस्टम-वाइड, नवीनतम स्थिर)
6. Maven + Gradle/opt में बाइनरी डाउनलोड
7. VNC स्टैकXvfb, x11vnc, noVNC, fluxbox — ब्राउज़र के माध्यम से रिमोट डिस्प्ले
8. Nerd फ़ॉन्टJetBrainsMono, Hack, FiraCode (नवीनतम रिलीज़)

चरण 2: final (अस्थिर टूल + उपयोगकर्ता सेटअप, ~1.5 GB)

Section titled “चरण 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-*) में संग्रहीत होती हैं। यह 10 GB GHA कैश सीमा से बचाता है जो इस ~6 GB मल्टी-आर्किटेक्चर इमेज के लिए बार-बार पूर्ण रीबिल्ड का कारण बनती थी।

दो-चरण आर्किटेक्चर रजिस्ट्री कैश के साथ इस प्रकार काम करता है:

  • टूल वर्शन अपडेट (npm, pip, बाइनरी टूल) — केवल final चरण रीबिल्ड (~5 मिनट)
  • कॉन्फ़िग फ़ाइल परिवर्तन (claude-config/, entrypoint.sh) — केवल अंतिम कुछ लेयर रीबिल्ड (~1 मिनट)
  • नींव परिवर्तन (APT पैकेज, Go/Rust/Java वर्शन) — दोनों चरणों का पूर्ण रीबिल्ड (~30 मिनट)