# Base Image Management ## چرا Base Image؟ Base image شامل تمام dependencies سنگین است که: - ✅ فقط یک بار build می‌شود - ✅ هر بار که کد تغییر می‌کند، دوباره download نمی‌شود - ✅ Build time را از 8-10 دقیقه به 3-4 دقیقه کاهش می‌دهد - ✅ قابل استفاده مجدد در چند پروژه ## محتویات Base Image Base image شامل موارد زیر است: ```dockerfile FROM python:3.11-slim # Build Tools - gcc, g++, make - curl, ca-certificates - git, unzip # Runtime - Python 3.11 - Node.js 20.x - npm (latest) - bun (latest) ``` ## ساخت Base Image ### روش 1: Local (توصیه می‌شود برای اولین بار) ```bash # Run the helper script ./build-base-local.sh ``` این script: 1. از شما username/password Harbor می‌خواهد 2. به registry login می‌کند 3. Base image را build می‌کند 4. به Harbor push می‌کند **زمان:** ~8-10 دقیقه (اولین بار) ### روش 2: در Woodpecker CI ```bash # Trigger pipeline manually in Woodpecker UI # یا از طریق git: git commit --allow-empty -m "build: rebuild base image" git push ``` Base image فقط در این حالت‌ها rebuild می‌شود: - `docker/Dockerfile.base` تغییر کرد - `.woodpecker.yml` تغییر کرد - Manual trigger ## استفاده از Base Image Dockerfile به صورت خودکار از base image استفاده می‌کند: ```dockerfile ARG BASE_IMAGE=hub.peikarband.ir/peikarband/base:latest FROM ${BASE_IMAGE} AS builder ``` ## مدیریت Versions ### Tags: 1. **`latest`**: آخرین نسخه (default) 2. **`python3.11-node20`**: نسخه specific ### تغییر Version: اگر می‌خواهید Python یا Node.js version تغییر کند: 1. Edit `docker/Dockerfile.base`: ```dockerfile ARG PYTHON_VERSION=3.12 # تغییر ARG NODE_VERSION=22 # تغییر ``` 2. Build base image: ```bash ./build-base-local.sh ``` 3. Update app Dockerfile: ```dockerfile ARG BASE_IMAGE=hub.peikarband.ir/peikarband/base:python3.12-node22 ``` ## Troubleshooting ### مشکل: Base image not found ```bash # Build locally: ./build-base-local.sh # یا check if exists: docker pull hub.peikarband.ir/peikarband/base:latest ``` ### مشکل: Build fails in CI ```bash # Check Woodpecker secrets: - HARBOR_USERNAME - HARBOR_PASSWORD # Test locally: docker login hub.peikarband.ir ``` ### مشکل: Base image outdated ```bash # Force rebuild: git commit --allow-empty -m "build: rebuild base image" git push # یا locally: ./build-base-local.sh ``` ## Build Times | Scenario | With Base | Without Base | |----------|-----------|--------------| | First build | 10 min | 10 min | | Code change only | 3 min ✅ | 10 min ❌ | | Dependency change | 3 min ✅ | 10 min ❌ | | Base change | 13 min | 10 min | ## Best Practices 1. **Build base image locally اولین بار** ```bash ./build-base-local.sh ``` 2. **فقط وقتی dependencies تغییر کرد rebuild کنید** - Python packages - Node.js version - System tools 3. **از versioned tags استفاده کنید در production** ```dockerfile ARG BASE_IMAGE=hub.peikarband.ir/peikarband/base:python3.11-node20 ``` 4. **Base image را در Harbor نگه دارید** - Private registry - Version control - Team access ## مثال: Workflow کامل ```bash # 1. Clone project git clone cd peikarband # 2. Build base image (فقط یک بار) ./build-base-local.sh # ⏱️ ~8-10 دقیقه # 3. Build app (بعدها) make docker-build # ⏱️ ~3 دقیقه ✅ # 4. تغییر کد vim peikarband/src/... # 5. Build again (سریع!) make docker-build # ⏱️ ~3 دقیقه ✅ (dependencies از cache) ``` ## خلاصه ✅ **مزایا:** - Build سریع‌تر (3 دقیقه vs 10 دقیقه) - بهینه‌سازی cache - قابل استفاده مجدد ❌ **نیاز به:** - Build اولیه (یک بار، 10 دقیقه) - نگهداری در registry - Rebuild وقتی dependencies تغییر کند **نتیجه:** برای development و production **بسیار** مفید است! 🚀