Docker وSwift: حاويات التطبيقات لنظامي iOS/macOS (مستوى متقدم)

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

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

ابدأ الدورة

Docker وSwift: حاويات التطبيقات لنظامي iOS/macOS (مستوى متقدم)



حاويات تطبيقات Swift تتجاوز مجرد تشغيل "Hello, World!" في Docker. على المستوى المتقدم، يواجه المطورون تحديات تحسين حجم الصور، وتعدد الخيوط، والعمل مع أطر الشبكات (SwiftNIO) وخوادم الويب (Vapor). في هذه المقالة، سنشرح كيفية بناء صورة Docker فعالة لمشروع Swift باستخدام البناء متعدد المراحل، وإعداد الحاوية لبيئة الإنتاج.



1. البناء متعدد المراحل (Multi-stage builds) لـ Swift



المشكلة الرئيسية لصور Docker الخاصة بـ Swift هي حجمها. الصورة الكاملة مع أدوات التجميع يمكن أن تزن أكثر من 2 جيجابايت. الحل هو البناء متعدد المراحل. المرحلة الأولى (build) تقوم بتجميع الملف الثنائي، والمرحلة الثانية (runtime) تحتوي فقط على الملف القابل للتنفيذ والاعتماديات الدنيا.



مثال Dockerfile لتطبيق Swift خادم (مثل Vapor):



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

WORKDIR /app

COPY Package.swift Package.resolved ./RUN swift package resolve

COPY Sources ./SourcesRUN swift build -c release --static-swift-stdlib

# المرحلة 2: صورة دنياFROM ubuntu:22.04 AS runtime

RUN apt-get update && apt-get install -y libssl-dev ca-certificates && rm -rf /var/lib/apt/lists/*

WORKDIR /appCOPY --from=build /app/.build/release/Run .

EXPOSE 8080CMD ["./Run"]


نقاط رئيسية:

  • --static-swift-stdlib — ربط ثابت للمكتبة القياسية لـ Swift، مما يقلل الاعتماد على المكتبات الديناميكية.
  • نسخ الملف الثنائي release فقط — الصورة النهائية تتقلص إلى ~100-150 ميجابايت.
  • استخدام Ubuntu 22.04 بدلاً من صورة Swift الكاملة — توفير في المساحة.


2. تحسين الطبقات وتخزين الاعتماديات مؤقتاً



Docker يخزن الطبقات مؤقتاً، لذا ترتيب التعليمات مهم. لمشاريع Swift، الاعتماديات (Package.swift, Package.resolved) تتغير بشكل أقل من الكود المصدري. افصل نسخ الملفات التعريفية والمصادر:



COPY Package.swift Package.resolved ./RUN swift package resolve

COPY Sources ./SourcesRUN swift build -c release


هذا يسمح بتخزين حل الاعتماديات مؤقتاً وعدم إعادة بنائها مع كل تغيير في الكود. لتسريع البناء، استخدم --build-arg لاختيار التكوين:



docker build --build-arg CONFIGURATION=release -t my-swift-app .


في Dockerfile أضف:

ARG CONFIGURATION=releaseRUN swift build -c ${CONFIGURATION}


3. حاويات SwiftNIO وVapor: العمل مع الشبكة



تطبيقات Swift الخادمة غالباً ما تستخدم SwiftNIO للعمل غير المتزامن مع الشبكة. في الحاوية، من المهم ضبط بيئة الشبكة بشكل صحيح.



3.1. إعداد Vapor في Docker



Vapor يستمع افتراضياً على localhost:8080. في الحاوية، يجب تحديد 0.0.0.0 لقبول الاتصالات الخارجية. أضف في configure.swift:



app.http.server.configuration.hostname = "0.0.0.0"app.http.server.configuration.port = 8080


أو استخدم متغيرات البيئة:

docker run -e HOST=0.0.0.0 -e PORT=8080 -p 8080:8080 my-swift-app


3.2. SwiftNIO وhealthcheck



لمراقبة الإنتاج، أضف healthcheck في Dockerfile:



HEALTHCHECK --interval=30s --timeout=3s --retries=3 \  CMD curl -f http://localhost:8080/health || exit 1


في كود SwiftNIO، نفذ endpoint /health:



func healthHandler(request: Request) -> EventLoopFuture<String> {    return request.eventLoop.makeSucceededFuture("OK")}


4. تقنيات متقدمة: Docker Compose والبناء متعدد المنصات



4.1. Docker Compose للخلفية Swift



إذا

المدونات

توصيات الكتب