Docker وSwift: حاويات التطبيقات من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا Docker وSwift هما الثنائي المثالي للتطوير الحديث

لطالما ارتبط عالم تطوير iOS وmacOS حصريًا بـ Xcode والبناء المحلي. ومع ذلك، مع ظهور Swift على الخادم (خاصة إطار العمل Vapor) وزيادة شعبية بنية الخدمات المصغرة، أصبحت الحاويات ليست مجرد موضة بل ضرورة. Docker لمطور Swift لا يقتصر فقط على عزل البيئة، بل يتعلق أيضًا بتوحيد عمليات البناء، وسهولة CI/CD، والنشر السهل على أي خادم.

في هذه المقالة، سنستعرض دورة العمل الكاملة مع Docker وSwift: من كتابة Dockerfile بسيط لنظامي macOS/Linux إلى نشر تطبيق ويب كامل على Vapor. ستتعلم كيفية تجنب الأخطاء الشائعة وجعل حاوياتك خفيفة وآمنة.



الجزء الرئيسي: دليل خطوة بخطوة لحاويات Swift



1. الأساسيات: Dockerfile لتطبيق Swift (macOS مقابل Linux)

أول شيء يجب فهمه: Swift هي لغة متعددة المنصات، لكن Docker يعمل تقليديًا على حاويات Linux. لتطوير macOS، يمكنك استخدام صور تحتوي على بناء Swift لنظام Linux (مثل swift:5.9-focal) أو، إذا كانت بيئة macOS ضرورية لك، استخدم المحاكاة الافتراضية (Docker Desktop for Mac). ومع ذلك، لتطبيقات الخادم (Vapor، Kitura)، فإن صور Linux هي المعيار.

Dockerfile أساسي لتطبيق Swift على الخادم (Vapor):

# نستخدم الصورة الرسمية لـ SwiftFROM swift:5.9-focal AS build

# نحدد دليل العملWORKDIR /app

# ننسخ ملفي Package.swift و Package.resolved لتخزين التبعيات مؤقتًاCOPY Package.swift Package.resolved ./RUN swift package resolve

# ننسخ الكود المصدريCOPY Sources ./SourcesRUN swift build -c release

# الصورة النهائية (الحد الأدنى)FROM ubuntu:focalWORKDIR /appCOPY --from=build /app/.build/release /appEXPOSE 8080CMD ["./Run"]

يستخدم هذا الأسلوب البناء متعدد المراحل (multi-stage build): المرحلة الأولى تترجم التطبيق، والثانية تنشئ صورة دنيا تحتوي فقط على الملف الثنائي والمكتبات الضرورية. تزن الصورة النهائية حوالي 60-80 ميجابايت بدلاً من 2 جيجابايت.



2. تحسين الصور: التخزين المؤقت والتبعيات

Swift هي لغة مترجمة، وكل بناء قد يستغرق دقائق. لتسريع العملية، استخدم التخزين المؤقت لطبقات Docker. الأسلوب الرئيسي: انسخ أولاً Package.swift و Package.resolved، ثم نفذ swift package resolve، وبعد ذلك فقط انسخ المصادر. هذا يضمن إعادة بناء التبعيات فقط عند تغيير Package.swift، وليس عند كل تغيير في الكود.

تحسين إضافي: استخدام .dockerignore:

.git.gitignore.build*.xcworkspace*.xcodeprojDerivedDataPackagesREADME.mdTests

يمنع هذا دخول الملفات غير الضرورية (الاختبارات، git، مشاريع Xcode) إلى سياق البناء، مما يسرع نقل السياق ويقلل حجم الصورة.



3. Docker Compose: ربط Swift بقاعدة البيانات وذاكرة التخزين المؤقت

نادرًا ما تعمل التطبيقات الحقيقية بشكل منعزل. بالنسبة للواجهة الخلفية النموذجية على Vapor، ستحتاج إلى PostgreSQL (أو Fluent)، و Redis للتخزين المؤقت، وربما Nginx. يتيح لك docker-compose.yml تشغيل كل شيء بأمر واحد.

مثال docker-compose.yml لتطبيق Swift مع PostgreSQL و Redis:

version: '3.8'services:  app:    build: .    ports:      - "8080:8080"    environment:      - DATABASE_HOST=db      - DATABASE_PORT=5432      - REDIS_HOST=redis      - REDIS_PORT=6379    depends_on:      - db      - redis    restart: unless-stopped

db: image: postgres:15-alpine environment: POSTGRES_DB: myapp POSTGRES_USER: user POSTGRES_PASSWORD: password volumes: - postgres_data:/var/lib/postgresql/data ports: - "5432:5432"

redis: image:

المدونات

توصيات الكتب