المستوى: متوسط — الشرح مبني على فرضية إنك بتشغّل Docker على خادم Linux واحد وبتعرف أساسيات الأوامر.
سكربت واحد في cron بيستعيد لك عشرات الجيجابايت من قرص الخادم كل أسبوع، من غير ما تلمس بياناتك ولا توقّف أي خدمة شغّالة.
أتمتة تنظيف Docker: استعِد مساحة قرص خادمك بأمان
المشكلة باختصار
الـ Docker مبيحذفش حاجة لوحده. كل build بيسيب صور معلّقة، وكل حاوية بتقف بتفضل على القرص، وكاش البناء بيكبر كل يوم. النتيجة: خادم بيوصل 90% امتلاء والتطبيق بيقف، والسيرفر "مرتاح". لو عندك خادم CI بيبني الصور 30 مرة في اليوم، ده ممكن ياكل 5 إلى 8 جيجا يوميًا.
ليه القرص بيمتلي أصلًا
خلّيها بمثال بسيط الأول. الصور القديمة والحاويات الميتة زي الكراتين الفاضية اللي بتتكدس في المخزن بعد كل شحنة. كرتونة أو اتنين مش مشكلة، لكن بعد شهر المخزن مليان كراتين مالهاش لازمة وانت مش لاقي مكان للبضاعة الجديدة. عامل النظافة اللي بيرمي الكراتين القديمة بس، وميلمسش البضاعة اللي لسه بتتباع، هو بالظبط اللي محتاجينه.
علميًا: كل docker build بينتج طبقات وسيطة وصور بدون tag اسمها dangling images. كل حاوية وقفت بتفضل محجوزة على القرص. وكاش البناء (build cache) بيتراكم مع كل بناء. Docker بيعتبرها "غير مستخدمة" لكنه مبيحذفهاش من نفسه عشان ميضيّعش حاجة انت ممكن تحتاجها.
الحل: تنظيف مجدوَل وآمن
الفكرة إنك تشغّل docker system prune بشكل تلقائي، بس بحرص. أهم قاعدة: متحذفش أي حاجة عمرها أقل من أسبوع، عشان متكسرش rollback أو build لسه محتاجه.
#!/usr/bin/env bash
set -euo pipefail
LOG=/var/log/docker-cleanup.log
echo "=== $(date '+%F %T') بدء التنظيف ===" >> "$LOG"
before=$(df --output=used -BG / | tail -1 | tr -dc '0-9')
# احذف الصور والحاويات والشبكات غير المستخدمة الأقدم من 7 أيام فقط
docker system prune --all --force --filter "until=168h" >> "$LOG" 2>&1
# نظّف كاش البناء الأقدم من أسبوع
docker builder prune --force --filter "until=168h" >> "$LOG" 2>&1
after=$(df --output=used -BG / | tail -1 | tr -dc '0-9')
echo "المساحة المستخدمة: قبل ${before}G / بعد ${after}G" >> "$LOG"
وبعدين ضيفه في crontab يشتغل كل ليلة الساعة 2 صباحًا:
0 2 * * * /usr/local/bin/docker-cleanup.sh