مولد ملفات Docker

Dockerfile
النتائج

ملف Docker هو أحد تلك الملفات التي تبدو قصيرة حتى تتذكر التفاصيل: ترتيب الطبقات مهم للتخزين المؤقت، وCOPY package.json يأتي قبل RUN npm install، واللغات المترجمة تستفيد من البناء متعدد المراحل. يكتب هذا المولّد ملف Docker جاهزًا للاستخدام للتقنية التي تختارها، مع نمط تخزين مؤقت صحيح منذ البداية.

كيفية إنشاء ملف Docker

  1. 1

    اختر التقنية

    Node.js أو Python أو PHP أو Go أو Rust. تستخدم كل قالب صورة أساسية مناسبة لتلك اللغة وأمر تثبيت التبعيات الصحيح.

  2. 2

    حدد مجلد العمل والمنفذ

    اختر WORKDIR والمنفذ الذي يستمع إليه تطبيقك؛ يُكتب كلاهما في الملف الناتج.

  3. 3

    راجع ملف Docker

    تأكد من أن سطر EXPOSE وأمر التشغيل يتوافقان مع تطبيقك. يستخدم قالبا Go وRust البناء متعدد المراحل.

  4. 4

    انسخ ملف Docker

    انسخ النتيجة والصقها في جذر مستودعك، ثم ابنِ الصورة.

لماذا البناء متعدد المراحل

يُثبّت ملف Docker البسيط سلسلة أدوات المترجم كاملة في الصورة النهائية. يمنحك البناء متعدد المراحل مرحلة “builder” تقوم بالترجمة ومرحلة نهائية تحمل الأثر المترجم فقط:

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

تتخلص الصورة النهائية من كل تبعيات التطوير وملفات المصدر وذاكرة التخزين المؤقت للبناء، وغالبًا ما تقلص حجم الصورة بنسبة 60-80 بالمئة.

أصناف الصورة الأساسية

تستخدم القوالب صورًا slim أو alpine حيثما أمكن. إذا عدّلت الصورة الأساسية بنفسك، فهذه هي الخيارات النموذجية:

الصنف الحجم النموذجي متى تختاره
full 300-900 م.ب صور التطوير، تبعيات نظام غير مألوفة
slim 80-200 م.ب معيار الإنتاج لمعظم اللغات
alpine 30-100 م.ب صور صغيرة، انتبه لمشاكل glibc مقابل musl
distroless 20-80 م.ب أقصى أمان؛ بلا قشرة أوامر وبلا مدير حزم

قواعد التخزين المؤقت للطبقات

يخزّن Docker كل سطر مؤقتًا؛ عندما تتغير طبقة، يُعاد بناء كل ما تحتها. الترتيب من الأقل إلى الأكثر تغيرًا:

  1. صورة FROM الأساسية (نادرًا ما تتغير).
  2. حزم النظام (apt-get install)، تغييرات نادرة.
  3. ملفات التبعيات (package.json، requirements.txt، composer.json).
  4. خطوة تثبيت التبعيات. تُنفَّذ فقط عند تغيّر ملف التبعيات.
  5. نسخ الكود المصدري. الطبقة الأكثر نشاطًا؛ يُعاد بناء كل ما بعدها في كل commit.
  6. الترجمة وCMD النهائي.

خرق هذا الترتيب هو السبب الأكثر شيوعًا لبطء عمليات بناء CI.

قائمة التحقق الأمنية

  • شغّل كغير root. ضع USER appuser (أو USER 1000) قرب النهاية.
  • ثبّت الإصدارات. python:3.12.7-slim أفضل من python:3.12، وهو أفضل من python:latest.
  • حدد WORKDIR صريحًا بدلًا من الاعتماد على /.
  • استخدم COPY لا ADD للملفات المحلية؛ لأن ADD له آثار جانبية لفك الضغط التلقائي.
  • أضف HEALTHCHECK حتى تكتشف الأنظمة المنسقة العملية المتعثرة.
  • نظّف مخابئ الحزم في سطر RUN نفسه: apt-get install ... && rm -rf /var/lib/apt/lists/*.

الأسئلة الشائعة

slim خيار افتراضي أكثر أمانًا لأنه ما زال يعتمد على glibc، مثل معظم الحزم المترجمة مسبقًا للمكتبات. يستخدم alpine نواة musl التي تسبب أحيانًا أخطاء تشغيل غامضة في Python (pandas وnumpy) أو Node (وحدات node-gyp الأصلية). اختر alpine عندما يكون حجم الصورة حرجًا وبعد اختبار التقنية.

نعم، أضف واحدًا إلى مشروعك. بدونه يرسل Docker مستودعك كاملًا إلى الخادم كسياق بناء: سجل git وnode_modules وملفات .env المحلية والاختبارات. ذلك بطيء ويهدر التخزين المؤقت ويُسرّب الأسرار.

نعم. استخدم docker buildx مع خيار --platform للبناء للمعماريتين معًا. الصور الأساسية التي تستخدمها القوالب تنشر إصدارات arm64.

لا. تُستخدم التقنية ومجلد العمل والمنفذ المختارين فقط لإنشاء ملف Docker في هذه الصفحة؛ لا يُحفظ شيء ولا يُشارَك.

أدوات ذات صلة

الأداة متاحة بلغات أخرى