تخطَّ إلى المحتوى

CMD

تعليمة CMD — الأمر الافتراضي عند التشغيل CMD

CMD تحدّد الأمر الذي يُنفَّذ افتراضيًا عند تشغيل حاوية من الصورة — يُستبدَل بالكامل لو مررت أمرًا صريحًا مع docker run.

لو كتبت أكثر من CMD في نفس الملف، Docker يتجاهل كل ما قبل الأخيرة — فقط آخر CMD له تأثير فعلي، ولا يوجد تراكم بينها. عند docker run image some-command، الأمر some-command يستبدل CMD بالكامل؛ هذا هو الفرق الجوهري عن ENTRYPOINT الذي لا يُستبدَل بهذه السهولة.

مثل RUN، لها صيغة تنفيذية CMD ["node", "server.js"] (موصى بها، بلا shell وسيط) وصيغة نصّية CMD node server.js (عبر /bin/sh -c). أكثر استخدام شائع لها: توفير وسائط افتراضية قابلة للاستبدال حين تُستخدم مع ENTRYPOINT بالصيغة التنفيذية معًا.

الصياغة

CMD ["executable", "param1", "param2"]  # exec form، موصى بها
CMD command param1 param2               # shell form
CMD ["param1", "param2"]                # وسائط افتراضية لـ ENTRYPOINT

📄 مثال

FROM node:20-alpine
WORKDIR /app
COPY . .
CMD ["node", "server.js"]

# docker run myapp             → يشغّل: node server.js
# docker run myapp node -v     → يستبدل CMD بالكامل: node -v

أهم النقاط

الخيارالوظيفة
exec formالصيغة الموصى بها؛ الأمر PID 1 مباشرة فتصله إشارات الإيقاف (SIGTERM) بشكل صحيح
shell formيمرّ عبر /bin/sh -c؛ يفهم متغيّرات البيئة لكن قد لا تصل إشارات الإيقاف للأمر الفعلي
آخر CMD فقطأكثر من CMD في نفس الملف — يُنفَّذ الأخير فقط، البقية تُتجاهل تمامًا

💡 نصائح عملية

  • استخدم الصيغة التنفيذية ["node", "server.js"] لا النصّية — تضمن وصول إشارات الإيقاف (SIGTERM) لتطبيقك مباشرة فيغلق بسلاسة
  • اجمع CMD مع ENTRYPOINT بالصيغة التنفيذية لكليهما لو أردت أمرًا ثابتًا مع وسائط افتراضية قابلة للاستبدال

⚠️ أخطاء شائعة

  • توقّع أن أكثر من CMD في نفس الملف يجمع الأوامر — فقط الأخيرة تُنفَّذ والبقية تُتجاهل صامتة
  • استخدام الصيغة النصّية لتطبيق طويل الأمد فلا يستقبل SIGTERM بشكل صحيح ويتأخر إيقافه حتى انتهاء مهلة docker stop

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DOCKER الكامل بالعربي.