حاويات تطبيقات Swift باستخدام Docker: دليل شامل للمطور

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

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

ابدأ الدورة

لماذا Swift وDocker هما الثنائي المثالي لتطوير الخادم

\n\n

إذا كنت معتادًا على الاعتقاد أن Swift هو فقط لتطوير تطبيقات iOS المحمولة، فقد حان الوقت لتتفاجأ. Swift يخطو بثقة نحو جانب الخادم: Vapor، Kitura، Perfect - أطر عمل تتيح لك كتابة خوادم خلفية سريعة وآمنة. لكن هناك مشكلة واحدة: كيف تضمن أن تطبيقك سيعمل بنفس الطريقة على جهاز Mac الخاص بالمطور وعلى خادم الإنتاج الذي يعمل بنظام Ubuntu؟

\n\n

الإجابة هي — حاويات تطبيقات Swift باستخدام Docker. Docker يسمح لك بتعبئة كل شيء: الملف الثنائي نفسه، مكتبات النظام، تبعيات Swift Package Manager (SPM) - وتشغيلها في أي مكان. لا مزيد من "يعمل لدي" و"لا يعمل لدي".

\n\n

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

\n\n

الخطوة 1. تحضير تطبيق Swift

\n\n

كمثال، سنأخذ تطبيق ويب بسيط على Vapor. إذا لم يكن لديك مشروع بعد، قم بإنشائه:

\n\n
mkdir MySwiftApp && cd MySwiftApp\nswift package init --type executable
\n\n

أضف Vapor إلى Package.swift:

\n\n
// swift-tools-version:5.7\nimport PackageDescription\n\nlet package = Package(\n    name: "MySwiftApp",\n    dependencies: [\n        .package(url: "https://github.com/vapor/vapor.git", from: "4.89.0")\n    ],\n    targets: [\n        .executableTarget(\n            name: "MySwiftApp",\n            dependencies: [\n                .product(name: "Vapor", package: "vapor")\n            ]\n        )\n    ]\n)
\n\n

أبسط ملف main.swift:

\n\n
import Vapor\n\nvar env = try Environment.detect()\ntry LoggingSystem.bootstrap(from: &env)\nlet app = Application(env)\ndefer { app.shutdown() }\n\napp.get("hello") { req -> String in\n    return "Hello from Swift in Docker!"\n}\n\ntry app.run()
\n\n

تحقق من أن المشروع يُترجم محليًا: swift build. إذا كان كل شيء على ما يرام - انتقل إلى الحاويات.

\n\n

الخطوة 2. كتابة Dockerfile لـ Swift

\n\n

السر الرئيسي لحاويات Swift الجيدة هو البناء متعدد المراحل. في المرحلة الأولى، نقوم بترجمة الملف الثنائي، وفي الثانية - ننسخ فقط الملف الثنائي وتبعيات وقت التشغيل. الصورة النهائية تكون أصغر بـ 5-10 مرات.

\n\n
# ---- المرحلة 1: البناء ----\nFROM swift:5.9-jammy AS build\n\nWORKDIR /app\n\n# نسخ Package.swift و Package.resolved لتخزين التبعيات مؤقتًا\nCOPY Package.swift ./\nCOPY Package.resolved ./\n\n# تحميل التبعيات بشكل منفصل - هذا يُخزن مؤقتًا بواسطة Docker\nRUN swift package resolve\n\n# نسخ الكود المصدري\nCOPY Sources ./Sources\n\n# البناء في وضع الإصدار\nRUN swift build -c release --static-swift-stdlib\n\n# ---- المرحلة 2: وقت التشغيل ----\nFROM ubuntu:jammy AS runtime\n\n# تثبيت الحد الأدنى من التبعيات لوقت تشغيل Swift\nRUN apt-get update && apt-get install -y \\\n    libicu70 \\\n    libcurl4 \\\n    libxml2 \\\n    && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /app\n\n# نسخ الملف الثنائي فقط من مرحلة البناء\nCOPY --from=build /app/.build/release/MySwiftApp .\n\n# المنفذ الذي يستمع عليه Vapor افتراضيًا\nEXPOSE 8080\n\nCMD ["./MySwiftApp"]
\n\n

النقاط الرئيسية:

\n
    \n
  • --static-swift-stdlib — الربط الثابت للمكتبة القياسية، لتجنب حمل libswiftCore.so في وقت التشغيل.
  • \n
  • تقسيم COPY — أولاً Package.swift، ثم الكود. بهذه الطريقة يستخدم Docker ذاكرة التخزين المؤقت للطبقات ولا يعيد بناء التبعيات عند تغيير المصادر.
  • \n
  • الصورة الأساسية ubuntu:jammy تزن حوالي 80 ميجابايت، الصورة النهائية حوالي 100-150 ميجابايت.
  • \n
\n\n

الخطوة 3. بناء وتشغيل الحاوية

\n\n

بناء الصورة:

\n\n
docker build -t my-swift-app .
\n\n

تشغيل:

\n\n
docker run -p 8080:8080 my-swift-app
\n\n

أو

المدونات

توصيات الكتب