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 الكامل بالعربي.