Docker وSwift: حاويات التطبيقات على iOS وmacOS

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

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

ابدأ الدورة
```html

مقدمة: لماذا يحتاج مطور Swift إلى Docker؟



العديد من مطوري Swift (خاصة في عالم iOS و macOS) اعتادوا على Xcode، والمحاكيات، والإدارة اليدوية للتبعيات. ومع ذلك، مع تزايد شعبية Swift من جانب الخادم (مثل إطار العمل Vapor) والحاجة إلى أتمتة الاختبار والنشر، أصبحت الحاويات مهارة أساسية.



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



1. أساسيات Docker لـ Swift: Dockerfile والبناء متعدد المراحل



النهج القياسي لحاويات تطبيقات Swift هو استخدام البناء متعدد المراحل. يتيح ذلك فصل مرحلة التجميع (حيث تكون أدوات Swift الثقيلة مطلوبة) ومرحلة التشغيل (حيث يكفي وجود الملف الثنائي المترجم فقط).



لنفكر في مشروع Swift نموذجي، مثل خادم Vapor. سننشئ ملف Dockerfile في جذر المشروع:



# المرحلة الأولى: البناءFROM swift:5.9-focal AS build

WORKDIR /app

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

# نسخ الكود المصدريCOPY . .

# البناء في وضع الإصدارRUN swift build -c release --static-swift-stdlib

# المرحلة الثانية: صورة مصغرة للتشغيلFROM ubuntu:focal

WORKDIR /app

# نسخ الملف الثنائي المُجمّع من المرحلة الأولىCOPY --from=build /app/.build/release/Run .

# فتح المنفذ (بشكل افتراضي، يستخدم Vapor المنفذ 8080)EXPOSE 8080

# تشغيل التطبيقCMD ["./Run"]


نقاط مهمة:

  • --static-swift-stdlib — الربط الثابت للمكتبة القياسية لـ Swift يقلل من التبعيات في مرحلة التشغيل.
  • نسخ Package.swift قبل الكود المصدري هو حيلة لتخزين طبقة التبعيات في Docker مؤقتًا.
  • الصورة الأساسية ubuntu:focal — خفيفة الوزن ولكنها تحتوي على جميع مكتبات النظام الضرورية.


2. بناء وتشغيل الحاوية



الآن بعد أن أصبح Dockerfile جاهزًا، سنقوم ببناء الصورة وتشغيل الحاوية:



# بناء الصورةdocker build -t my-swift-app .

# تشغيل الحاوية في الخلفية مع تمرير المنفذdocker run -d -p 8080:8080 --name swift-container my-swift-app

# التحقق من السجلاتdocker logs swift-container

# الاختبار (إذا كان التطبيق خادم HTTP)curl http://localhost:8080/


إذا كنت تستخدم Swift Package Manager بدون Vapor، فقد يكون اسم الملف الثنائي مختلفًا. في هذه الحالة، قم بتغيير المسار في COPY --from=build و CMD. يمكنك معرفة الاسم الدقيق للملف الثنائي باستخدام الأمر:



swift build -c release --show-bin-path


2.1. العمل مع .dockerignore



لتجنب نسخ الملفات غير الضرورية إلى سياق البناء (مثل .git، build/)، قم بإنشاء .dockerignore:



.git.gitignore.build/*.xcodeproj*.xcworkspace.DS_StoreREADME.md


3. Docker Compose لتطبيقات Swift



إذا كان مشروعك يستخدم قاعدة بيانات (PostgreSQL، Redis) أو عدة خدمات مصغرة، فمن الملائم استخدام docker-compose.yml. مثال لـ Vapor + PostgreSQL:



version: '3.8'

services: app: build: . ports: - "8080:8080" environment: - DATABASE_HOST=db - DATABASE_PORT=5432 - DATABASE_NAME=vapor_db - DATABASE_USER=vapor_user - DATABASE_PASSWORD=secret depends_on: - db

db: image: postgres:15 environment: POSTGRES_DB: vapor_db POSTGRES_USER: vapor_user POSTGRES_PASSWORD: secret ports: ```

المدونات

توصيات الكتب