RUN
تعليمة RUN — تنفيذ أوامر أثناء البناء RUN
RUN تنفّذ أمرًا أثناء بناء الصورة (تثبيت حِزَم مثلًا) وتحفظ نتيجته كطبقة جديدة دائمة — بعكس CMD التي تنفَّذ فقط عند تشغيل الحاوية.
لـ RUN صيغتان: الصيغة النصّية (shell form) RUN npm install تُنفَّذ عبر /bin/sh -c، فتفهم متغيّرات البيئة والأنابيب (|) مباشرة. الصيغة التنفيذية (exec form) RUN ["npm", "install"] تُنفَّذ مباشرة دون shell وسيط، فلا تفهم متغيّرات البيئة أو الأنابيب تلقائيًا إلا إذا استدعيت sh صراحة.
كل RUN تُنتج طبقة (layer) جديدة تُخزَّن في الكاش. لو لم يتغيّر أي شيء قبل تعليمة RUN معيّنة في بناء لاحق، Docker يعيد استخدام نتيجتها المخزَّنة دون إعادة تنفيذها — وهذا أساس ترتيب التعليمات لتسريع البناء.
الصياغة
RUN <command> # shell form RUN ["executable", "arg1"] # exec form
📄 مثال
FROM node:20-alpine WORKDIR /app COPY package*.json ./ # طبقة واحدة تجمع تحديث وتثبيت وتنظيف الكاش RUN npm ci --production && npm cache clean --force
أهم النقاط
| الخيار | الوظيفة |
|---|---|
| shell form | RUN cmd — عبر /bin/sh -c، يدعم && والأنابيب ومتغيّرات البيئة مباشرة |
| exec form | RUN ["cmd", "arg"] — بلا shell وسيط، أوضح وأقل مفاجآت |
| --mount=type=cache | يسرّع تثبيت الحِزَم بكاش يبقى بين عمليات بناء مختلفة (BuildKit) |
💡 نصائح عملية
- اجمع أوامر متتالية مرتبطة (apt update && apt install && rm -rf cache) في RUN واحد بدل عدّة أسطر — يقلّل عدد الطبقات وحجمها
- ضع RUN الأقل تغيّرًا (تثبيت أدوات النظام) قبل RUN الأكثر تغيّرًا (تثبيت اعتماديات مشروعك) للاستفادة القصوى من الكاش
⚠️ أخطاء شائعة
- تقسيم apt update وapt install في تعليمتي RUN منفصلتين — الكاش قد يُبقي update قديمًا فيثبّت حِزَمًا بإصدارات غير متوقَّعة
- نسيان تنظيف كاش مدير الحِزَم في نفس RUN — ينتفخ حجم الصورة رغم أن الملفّات غير مفيدة بعد التثبيت
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DOCKER الكامل بالعربي.