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-app3.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
إذا