تخطَّ إلى المحتوى

التطوير المحلي

هذه الصفحة مخصصة للمطورين الذين يرغبون في استنساخ المستودع أو بناء الصورة محلياً أو تخصيص ملف 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 إعادة البناء حتى لو كانت هناك صورة مخزنة مؤقتاً.

بنية البناء ذات المرحلتين

Section titled “بنية البناء ذات المرحلتين”

يستخدم ملف Dockerfile بناءً من مرحلتين مُحسّناً للتخزين المؤقت لطبقات Docker:

المرحلة 1: deps (الأسس المستقرة، ~4.5 جيجابايت)

Section titled “المرحلة 1: deps (الأسس المستقرة، ~4.5 جيجابايت)”

تُعاد بناء هذه الطبقات فقط عند تحديث إصدار ARG أو تغيير حزم APT. عند التغييرات المتعلقة بالأدوات فقط، يتخطى BuildKit هذه المرحلة بالكامل.

القسمالمحتويات
1. مستودعات APTNodeSource، deadsnakes، HashiCorp، GitHub، Docker، Microsoft، Google Cloud، Dart SDK
2. حزم APTأدوات النظام، Node.js، Python، Java، Terraform، GitHub CLI، محرك Docker، Azure CLI، PowerShell، الإعدادات المحلية
2ب. حزم APT الأمنيةتحليل الشبكات، ماسحات الويب، أدوات كلمات المرور، الهندسة العكسية، الطب الشرعي الرقمي (~80 حزمة)
3. تهيئة Pythonالروابط الرمزية + pip عبر get-pip.py
4. Goأرشيف رسمي (أحدث إصدار مستقر، يُحدد وقت البناء)
5. Rustrustup (على مستوى النظام، أحدث إصدار مستقر)
6. Maven + Gradleتنزيلات ثنائية إلى /opt
7. حزمة VNCXvfb، x11vnc، noVNC، fluxbox — عرض عن بُعد عبر المتصفح
8. خطوط NerdJetBrainsMono، Hack، FiraCode (أحدث الإصدارات)

المرحلة 2: final (الأدوات المتغيرة + إعداد المستخدم، ~1.5 جيجابايت)

Section titled “المرحلة 2: final (الأدوات المتغيرة + إعداد المستخدم، ~1.5 جيجابايت)”

تتغير هذه الطبقات بشكل أكثر تكراراً (تحديثات npm/pip، تغييرات التكوين) لكنها تُعاد بناؤها بسرعة لأن مرحلة deps الثقيلة مخزنة مؤقتاً.

القسمالمحتويات
9. AWS CLI v2المُثبّت الرسمي
10. أدوات ثنائيةkubectl، helm، tflint، terraform-docs، act، actionlint، yt-dlp، uv
10ب. ثنائيات إضافيةVS Code CLI، oc، yq، terragrunt، ibmcloud، fzf، hadolint، codex
10ج. ثنائيات Super-lintershfmt، gitleaks، editorconfig-checker، trivy، clj-kondo، dotenv-linter، golangci-lint، goreleaser، kubeconform، protolint، scalafmt، ktlint
10د. أدوات Java JARcheckstyle، google-java-format (سكربتات تغليف)
10هـ. أدوات فحص PHPphpcs، phpstan، psalm (تنزيلات PHAR)
10و. وحدات PowerShellPSScriptAnalyzer، arm-ttk
10ز. ثنائيات أمنيةnuclei، subfinder، httpx، ffuf، gobuster، feroxbuster، dalfox، amass، trufflehog، grype، syft، bettercap (amd64)
10ح. OWASP ZAPماسح تطبيقات ويب قائم على Java
10ط. Ghidraإطار عمل الهندسة العكسية
10ي. Metasploitإطار عمل الاستغلال (amd64 فقط)
11. أدوات npm العامةclaude-code، prettier، markdownlint-cli2، devcontainers-cli، playwright، pi-coding-agent، oh-my-pi
12. أدوات pippre-commit، ansible، black، pylint، yamllint، playwright
12ج. أدوات فحص Rubyrubocop + إضافات
12هـ. وحدات فحص Perlإضافات Perl::Critic
12و. أداة فحص Lualuacheck
12ز. أداة فحص Rlintr
12ح. جواهر Ruby الأمنيةwpscan، evil-winrm
12ط. أدوات أمنية مستنسخة من Gittestssl.sh، exploitdb (searchsploit)، SecLists، docker-bench-security، recon-ng، spiderfoot
13. متصفحات PlaywrightChromium + تبعيات النظام عبر playwright install --with-deps
13ب. Chrome DevTools MCPرابط رمزي لـ Chrome + تخزين مسبق لـ MCP + تصحيح الوضع بدون واجهة
14. HomebrewLinuxbrew (تبعيات مساعد الذكاء الاصطناعي + أدوات التنسيق)
15. إضافات ZSHإضافات oh-my-zsh المخصصة
16. تهيئة Shellnpm-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 → إعادة بناء الحاوية.

أضف إلى كتلة apt-get install في القسم 2:

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

أضف إلى كتلة npm install -g في القسم 11:

RUN npm install -g \
your-npm-tool

أضف إلى كتلة pip install في القسم 12:

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

ذاكرة التخزين المؤقت للبناء

Section titled “ذاكرة التخزين المؤقت للبناء”

يستخدم CI التخزين المؤقت القائم على السجل — تُخزّن طبقات البناء في GHCR (ghcr.io/f5-sales-demo/devcontainer:cache-*) بدلاً من ذاكرة التخزين المؤقت لـ GitHub Actions. هذا يتجنب حد ذاكرة التخزين المؤقت لـ GHA البالغ 10 جيجابايت والذي كان يتسبب في إعادة بناء كاملة متكررة لهذه الصورة متعددة البنيات بحجم ~6 جيجابايت.

تعمل بنية المرحلتين مع ذاكرة التخزين المؤقت للسجل بحيث:

  • تحديثات إصدارات الأدوات (npm، pip، أدوات ثنائية) — إعادة بناء مرحلة final فقط (~5 دقائق)
  • تغييرات ملفات التكوين (claude-config/، entrypoint.sh) — إعادة بناء الطبقات الأخيرة فقط (~دقيقة واحدة)
  • تغييرات الأسس (حزم APT، إصدارات Go/Rust/Java) — إعادة بناء كاملة لكلتا المرحلتين (~30 دقيقة)