حاويات تطبيقات Rust باستخدام Docker: من الملف الثنائي إلى الإنتاج

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

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

ابدأ الدورة

لماذا Rust وDocker زوج مثالي؟

\n\n

تخيل: لقد كتبت تطبيقًا فائق السرعة بلغة Rust يعالج ملايين الطلبات في الثانية. يتم تجميعه في ملف ثنائي ثابت، ولا يتطلب آلة افتراضية، ويعمل أسرع من C++ في بعض السيناريوهات. ولكن كيف تنقل هذه الأعجوبة الهندسية إلى الخادم؟ كيف تضمن أنها ستعمل بنفس الطريقة على جهاز المطور المحلي، وفي CI/CD، وفي الإنتاج؟

\n\n

الإجابة بسيطة — حاويات تطبيقات Rust باستخدام Docker. يتيح لك Docker حزم تطبيقك مع جميع التبعيات في حاوية خفيفة الوزن. وRust، بفضل طبيعتها، تجعل هذه العملية فعالة بشكل لا يصدق. في هذه المقالة، لن نكتب Dockerfile فحسب — بل سنحول ملفك الثنائي إلى عمل فني في عالم الحاويات.

\n\n

إذا كنت بالفعل على دراية بـ التطوير بلغة Rust، ولكنك ترغب في إتقان DevOps لمشاريع Rust — فأنت في المكان الصحيح. هيا بنا!

\n\n

مشكلة Dockerfile "الساذج" لـ Rust

\n\n

غالبًا ما يكتب المبتدئون شيئًا كهذا:

\n\n
FROM rust:latest\nWORKDIR /app\nCOPY . .\nRUN cargo build --release\nCMD ["./target/release/my_app"]
\n\n

هذا يعمل. لكن دعونا نواجه الحقيقة: هذا النهج يشبه قيادة سيارة فيراري على طريق وعِر. لماذا؟

\n\n
    \n
  • حجم صورة ضخم — حوالي 1.5 جيجابايت بسبب المترجم وأدوات البناء
  • \n
  • إعادة بناء بطيئة — لا يتم استخدام ذاكرة التخزين المؤقت للتبعيات
  • \n
  • ثغرات أمنية — الصورة تحتوي على الكثير من الحزم غير الضرورية
  • \n
  • انتهاك أفضل الممارسات — يجب ألا يحتوي وقت التشغيل على مترجم
  • \n
\n\n

تتطلب حاويات تطبيقات Rust الحقيقية نهجًا أكثر ذكاءً. واسمه — البناء متعدد المراحل (multi-stage build).

\n\n

حاويات Rust الصحيحة: البناء متعدد المراحل

\n\n

الفكرة بسيطة: المرحلة الأولى — "السقالات البنائية" حيث يعيش المترجم. الثانية — "وقت تشغيل" نظيف، حيث يصل فقط الملف الثنائي النهائي. دعونا ننفذ هذا عمليًا.

\n\n

الخطوة 1: Dockerfile أساسي

\n\n

لننشئ ملف Dockerfile في جذر مشروع Rust الخاص بك (بجانب Cargo.toml):

\n\n
# ====================\n# المرحلة 1: البناء\n# ====================\nFROM rust:1.77-slim-bookworm AS builder\n\n# إنشاء مشروع فارغ لتخزين التبعيات مؤقتًا\nRUN USER=root cargo new /app\nWORKDIR /app\n\n# نسخ ملفات البيان فقط (لتخزين الطبقات مؤقتًا)\nCOPY Cargo.toml Cargo.lock ./\n\n# بناء التبعيات (هذه الطبقة تُخزَّن مؤقتًا إذا لم يتغير Cargo.toml)\nRUN cargo build --release 2>/dev/null || true\n\n# الآن ننسخ الكود المصدري\nCOPY src ./src\n\n# بناء التطبيق (فقط الملفات التي تغيرت)\nRUN cargo build --release\n\n# ====================\n# المرحلة 2: صورة مصغرة\n# ====================\nFROM debian:bookworm-slim AS runtime\n\n# تثبيت التبعيات الدنيا (إذا لزم الأمر)\n# RUN apt-get update && apt-get install -y ca-certificates tzdata && rm -rf /var/lib/apt/lists/*\n\n# نسخ الملف الثنائي من builder\nCOPY --from=builder /app/target/release/my_app /usr/local/bin/my_app\n\n# إعدادات الإنتاج\nENV RUST_LOG=info\nENV APP_ENV=production\n\n# التشغيل من مستخدم غير مميز\nRUN useradd -m -u 1000 appuser\nUSER appuser\n\nEXPOSE 8080\nCMD ["my_app"]
\n\n

لاحظ السحر مع COPY Cargo.toml Cargo.lock ./ و cargo build قبل نسخ الكود المصدري. هذه هي الحيلة الأساسية لـ تحسين بناء Docker لـ Rust: Docker يخزن الطبقات مؤقتًا، وطالما لم تغير التبعيات، لن يتم إعادة بناء هذه المرحلة. توفير الوقت — من 5 إلى 15 دقيقة لكل بناء!

\n\n

الخطوة 2: استخدام Alpine (تخفيف شديد)

\n\n

إذا كنت ترغب في الحصول على صورة بحجم أقل من 10 ميجابايت، استخدم alpine:

\n\n
# مرحلة البناء تبقى كما هي\n\n# المرحلة 2: Alpine\nF                

المدونات

توصيات الكتب