ایک جونیئر ڈویلپر نے پائتھن (Python) ڈکر (Docker) امیج کا سائز 1.2 GB سے کم کر کے 85 MB کر دیا، جس سے CI پائپ لائن کا وقت 11 منٹ سے کم ہو کر 90 سیکنڈ رہ گیا۔ چھوٹے امیجز تیزی سے ڈاؤن لوڈ ہوتے ہیں، اسٹوریج کا خرچہ کم ہوتا ہے، اور ان میں سیکیورٹی کے خطرات بھی کم ہوتے ہیں۔
امیج کا سائز کیوں اہم ہے
جب بھی کوئی کنٹینر پل (pull) کیا جاتا ہے، رجسٹری پوری امیج کو اسٹریم کرتی ہے۔ 85 MB کی لیئر (layer) سیکنڈوں میں ڈاؤن لوڈ ہو جاتی ہے؛ جبکہ ایک عام نیٹ ورک پر 1.2 GB کی لیئر میں منٹ لگ سکتے ہیں۔ بلڈ ایجنٹس کو بھی پوری امیج اپ لوڈ اور کیش (cache) کرنی پڑتی ہے، جس سے CI کا وقت اور کلاؤڈ اسٹوریج کے بل بڑھ جاتے ہیں۔ ہر اضافی پیکج ایک ممکنہ کمزوری (vulnerability) ہو سکتا ہے، اس لیے بیس (base) کو کم کرنے سے حملے کا خطرہ (attack surface) کم ہو جاتا ہے۔
امیج کا سائز کیوں بڑھتا ہے (bloat)
- اگر gcc جیسے بلڈ ٹولز اسی اسٹیج (stage) میں انسٹال کیے جائیں جہاں ایپ چلتی ہے، تو وہ فائنل امیج میں رہ جاتے ہیں۔
- پیکج مینیجر کیشز (مثلاً
aptیاpipکیشز) ڈسک پر رہتے ہیں اور ڈیفالٹ طور پر کبھی صاف نہیں کیے جاتے۔ - ہر
RUNانسٹرکشن ایک نئی ریڈ اونلی (read-only) لیئر بناتی ہے؛ لیئرز کے درمیان ڈپلیکیٹ فائلیں سائز بڑھا دیتی ہیں۔ ubuntu:latestجیسی بڑی بیس امیجز کے ساتھ مکمل OS آتا ہے، جو کہ ایک معمولی پائتھن رن ٹائم (Python runtime) کی ضرورت سے کہیں زیادہ ہے۔
سائز کم کرنے کے تین مراحل
| مرحلہ | بیس امیج | بلڈ کا طریقہ کار | نتیجہ کا سائز |
|---|---|---|---|
| 1 | Standard Python (full) | سنگل اسٹیج، تمام ٹولز موجود | 1.18 GB |
| 2 | python:slim |
ملٹی اسٹیج: builder جس میں gcc ہو، فائنل اسٹیج صرف کمپائل شدہ پیکجز کاپی کرے | 210 MB |
| 3 | python:alpine |
Alpine Linux پر ملٹی اسٹیج، جو خود بہت چھوٹی ہے | 85 MB |
مرحلہ 1 – بنیادی سطح (baseline)
ڈیفالٹ پائتھن امیج سے شروع کرتے ہوئے، ڈویلپر کو 1.18 GB کا آرٹفیکٹ (artifact) ملا۔ اس امیج میں مکمل Debian اسٹیک، ڈویلپمنٹ ہیڈرز، اور pip کیش شامل تھے۔
مرحلہ 2 – builder کے ساتھ slim
python:slim پر سوئچ کرنے سے OS کا سائز تو کم ہو گیا، لیکن بلڈ ٹولز برقرار رہے۔ ایک builder اسٹیج شامل کرنے سے gcc، make، اور دیگر کمپائل ٹائم ڈیپینڈنسیز (dependencies) کو انسٹال، کمپائل اور پھر ختم کرنے کی سہولت ملی۔ فائنل اسٹیج میں صرف کمپائل شدہ wheels اور رن ٹائم فائلز لینے کے لیے COPY --from=builder کا استعمال کیا گیا، جس سے سائز کم ہو کر 210 MB رہ گیا۔
مرحلہ 3 – Alpine کی جیت
Alpine Linux، musl libc اور busybox پر مبنی ہے۔ Alpine پر ملٹی اسٹیج پیٹرن کو دہرانے سے 85 MB کی امیج تیار ہوئی—جو اصل امیج سے 93% کم تھی۔ ڈویلپر نے نوٹ کیا کہ Kubernetes نے امیج کو سیکنڈوں میں پل (pull) کر لیا اور CI جاب 90 سیکنڈ میں مکمل ہو گئی۔
حقیقی دنیا پر اثرات
- اسٹوریج کے اخراجات میں کمی – رجسٹری اسٹوریج کم ہو جاتی ہے۔
- بہتر سیکیورٹی – کم پیکجز کا مطلب ہے ٹریک کرنے کے لیے کم CVEs۔ Alpine امیج میں صرف پائتھن رن ٹائم اور ایپلی کیشن کوڈ شامل ہے۔
- تیز رفتار CI – پائپ لائن کا وقت 11 منٹ سے کم ہو کر 90 سیکنڈ رہ گیا۔
اپنے Dockerfile کو چھوٹا کرنے کے لیے عملی مشورے
:latestٹیگز سے پرہیز کریں؛:slimیا:alpineورژنز کا انتخاب کریں جو آپ کی ضروریات کے مطابق ہوں۔- ملٹی اسٹیج بلڈز استعمال کریں: کمپائلیشن کے لیے ایک مخصوص builder اسٹیج، اور ایک runtime اسٹیج جو صرف وہی آرٹفیکٹس (artefacts) وصول کرے جن کی آپ کو واقعی ضرورت ہے۔
COPY --from=builder /path/to/installed /path/in/finalکے ذریعے منتخب طریقے سے کاپی کریں۔- کمانڈز کو اس ترتیب میں رکھیں کہ سورس کوڈ کاپی کرنے سے پہلے ڈیپینڈنسی انسٹالیشن ہو؛ اس سے لیئر کیشنگ (layer caching) کا فائدہ زیادہ سے زیادہ ملتا ہے۔
- کیشز کو واضح طور پر صاف کریں، مثلاً
rm -rf /var/lib/apt/lists/* ~/.cache/pip۔
اگر آپ Alpine استعمال کرتے ہیں، تو جب آپ کی ایپ کو DNS ریزولوشن کے مسائل کا سامنا ہو تو nss پیکج شامل کر دیں۔ pip کے ذریعے انسٹال کرتے وقت، PATH کے شروع میں /root/.local/bin شامل کریں تاکہ رن ٹائم پر مقامی طور پر انسٹال شدہ اسکرپٹس مل سکیں۔
احتیاطی تدابیر (Caveats)
Alpine کی musl libc، glibc کے لیے کمپائل شدہ بائنری wheels کے ساتھ ٹکرا سکتی ہے، جس سے رن ٹائم ایررز (errors) پیدا ہو سکتے ہیں۔ ایسی صورت میں، Alpine builder کے اندر wheels کو دوبارہ کمپائل کریں یا slim بیس پر واپس چلے جائیں۔ DNS کی بھروسہ مندی کے لیے اضافی nss پیکج ایک معمولی قیمت ہے۔
آگے کیا دیکھیں
- اپنی موجودہ امیجز میں بڑی لیئرز تلاش کریں جنہیں ملٹی اسٹیج ری رائٹ (rewrite) کے لیے استعمال کیا جا سکتا ہے۔
- امیج کے بڑھتے ہوئے سائز کا پتہ لگانے کے لیے اپ لوڈ اور ڈاؤن لوڈ کے اوقات کے لیے CI لاگز (logs) مانیٹر کریں۔
- اپنے منتخب کردہ بیس ڈسٹری بیوشن (base distribution) کے لیے کمزوریوں کی رپورٹس (vulnerability reports) پر نظر رکھیں۔
سبق واضح ہے: ایک منظم Dockerfile، ایک ہلکی بیس (lightweight base)، اور ایک builder اسٹیج پائتھن امیج کے سائز کو کئی گنا کم کر سکتے ہیں، جو فنکشنلٹی سے سمجھوتہ کیے بغیر ٹھوس رفتار اور لاگت کے فوائد فراہم کرتے ہیں۔
