Docker وRust: حاويات التطبيقات المتقدمة
حاويات تطبيقات Rust باستخدام Docker ليست مجرد تغليف للكود في صورة. على المستوى المتقدم، إنها فن إنشاء حاويات صغيرة وسريعة وآمنة تناسب بيئة الإنتاج تمامًا. Rust، كلغة برمجة نظامية، يتم تجميعها إلى كود أصلي، مما يوفر فرصًا فريدة لتحسين صور Docker. في هذه المقالة، سنستعرض تقنيات تتجاوز docker build الأساسي، ونوضح كيفية إنشاء حاويات فعالة لتطبيقات Rust.
1. البناء متعدد المراحل (Multi-stage build) لـ Rust
البناء متعدد المراحل هو حجر الزاوية في حاويات Rust المتقدمة. يسمح بفصل بيئة البناء (مع المترجم، التبعيات والأدوات) عن الصورة النهائية التي تحتوي فقط على الملف الثنائي المترجم وتبعيات وقت التشغيل الضرورية.
لنلقِ نظرة على مثال Dockerfile لخادم ويب باستخدام actix-web:
# المرحلة 1: البناءFROM rust:1.75-slim-bullseye AS builder
WORKDIR /app
# نسخ ملفات التبعيات فقط لتخزين الطبقات مؤقتًاCOPY Cargo.toml Cargo.lock ./
# إنشاء main.rs فارغ لتجميع التبعياتRUN mkdir src && echo "fn main() {}" > src/main.rsRUN cargo build --release 2>/dev/null || true
# الآن نسخ الكود المصدري الفعليCOPY src ./src
# إعادة تجميع الملفات المعدلة فقط (ذاكرة التخزين المؤقت للتبعيات لم تتأثر)RUN cargo build --release
# المرحلة 2: الصورة النهائيةFROM debian:bullseye-slim
RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ libssl1.1 \ && rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/target/release/my_app /usr/local/bin/my_app
USER nobodyEXPOSE 8080
CMD ["/usr/local/bin/my_app"]التحسينات الرئيسية:
- تخزين التبعيات مؤقتًا: يتم نسخ
Cargo.tomlوCargo.lockأولاً، ثم تجميع التبعيات. هذا يسمح لـ Docker باستخدام ذاكرة التخزين المؤقت للطبقات إذا لم تتغير ملفات البيان. - صورة نهائية صغيرة: استخدام
debian:bullseye-slimبدلاً من صورة Rust الكاملة. هذا يقلل الحجم من ~1.5 جيجابايت إلى ~150 ميجابايت. - الأمان: يتم تشغيل التطبيق كمستخدم
nobodyوليس كجذر.
2. تقليل حجم الصورة: من Alpine إلى scratch
تطبيقات Rust لا تتطلب بيئة تشغيل مثل آلة Java الافتراضية أو مفسر Python. هذا يسمح باستخدام صور أساسية صغيرة.
الخيار مع Alpine Linux:
FROM alpine:3.19 AS builderRUN apk add --no-cache musl-dev# ... البناء ...
FROM alpine:3.19RUN apk add --no-cache ca-certificatesCOPY --from=builder /app/target/release/my_app /my_appCMD ["/my_app"]الخيار مع scratch (صورة فارغة):
FROM alpine:3.19 AS builderRUN apk add --no-cache musl-dev# البناء مع الربط الثابتRUN cargo build --release --target x86_64-unknown-linux-musl
FROM scratchCOPY --from=builder /app/target/x86_64-unknown-linux-musl/release/my_app /my_appCOPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/CMD ["/my_app"]مقارنة أحجام الصور:
- debian:bullseye-slim: ~80-150 ميجابايت (حسب عدد مكتبات النظام)
- alpine:3.19: ~10-20 ميجابايت (يستخدم musl libc بدلاً من glibc)
- scratch: ~5-10 ميجابايت (الملف الثنائي والشهادات فقط)
هام: عند استخدام scratch، يجب التأكد من أن تطبيقك لا يتطلب مكتبات ديناميكية. لهذا، استخدم الربط الثابت مع الهدف