أتمتة تنظيف Docker على السيرفر — سكربت أسبوعي يوفّر 40GB كل شهر
لو شغّلت df -h على سيرفر فيه Docker شغّال من 3 شهور، غالبًا هتلاقي 40% على الأقل من الـ disk ضايع في images قديمة و volumes يتيمة. السكربت اللي في المقال ده بيفضّي المساحة دي أسبوعيًا بدون ما تفقد أي container شغّال.
المشكلة باختصار
Docker بيحتفظ بكل image بنيتها، كل container وقف ومتشالش، وكل volume مش متربط بأي حاجة شغّالة. لو بتبني الـ image عشر مرات في اليوم (CI، تجارب محلية، hotfixes)، المساحة بتتراكم بسرعة رهيبة. على سيرفر CI عندي بيبني 20 مرة يوميًا، الـ disk بيمتلي في حوالي شهر من غير ما تلاحظ.
مثال بسيط جدًا للمبتدئين
تخيّل إنك كل ما تطبخ وجبة، بترمي الصحون في الحوض بدل ما تغسلها. أول يومين الموضوع عادي. بعد أسبوع، المطبخ كله مش قابل للاستخدام، والحوض بيفيض. Docker بالظبط كده — كل build بيسيب "صحون" (images قديمة، containers واقفة، caches، volumes يتيمة) لو متشالتش، بتبوّظ المطبخ. الفرق إن هنا "المطبخ" هو الـ disk بتاع السيرفر، ولمّا يمتلي بتوقع production.
الشرح العلمي
Docker معماريًا مبني على layered filesystem. كل docker build بينتج layers جديدة، والقديمة متبقاش مربوطة بأي tag أو container لكن مش بتتمسح تلقائيًا. نفس الحاجة بتحصل مع:
- Exited containers: كل
docker runبدون--rmبيسيب container جثّة لما يخلّص شغله. - Dangling images: images اتبنت وبعدين اتبنى فوقها tag جديد — الـ tag انتقل، لكن الـ image الأصلي لسه على الـ disk.
- Anonymous volumes: لو container كان بيستخدم volume من غير اسم، لمّا تشيل الـ container الـ volume بيفضل موجود للأبد.
- BuildKit cache: مجرد الـ build cache لوحده ممكن يوصل 30-50GB على سيرفر CI نشط.
ليه الحل اليدوي مش كفاية
الأمر المشهور docker system prune -a بيبان إنه يحل المشكلة. في الواقع بيعمل 3 مشاكل:
- بيمسح images هتحتاجها في البناء القادم — زي
node:20أوpostgres:16. نتيجة: أول build بعدها بياخد 3-5 دقايق زيادة عشان يسحب الـ base images من الـ registry تاني. - بيلمس volumes لو زوّدت
--volumes— ممكن تمسح volume فيه data إنتاج بالغلط لو مش مربوط حاليًا بأي container شغّال. - مبيتشرطش وقت — لو شغّلته الساعة 10 الصبح وحد بيعمل deploy في نفس اللحظة، بتخاطر بـ race condition على الـ images.
البديل: سكربت يتحكم بالظبط في إيه يتمسح وإيه يتساب، ويشتغل في وقت هادي (فجر الأحد مثلًا)، ويبعت لك تنبيه بالنتيجة.