لاستعادة وحدة تخزين مسماة في Docker Compose على نظام macOS، أوقف الخدمات التي تكتب إليها، وحدد الاسم الدقيق لوحدة تخزين Docker، واستخرج الأرشيف الاحتياطي إلى وحدة التخزين تلك باستخدام حاوية مؤقتة. يحتفظ Docker Desktop بوحدات تخزين Linux داخل جهازه الافتراضي (VM) الخاص بنظام Linux، لذا استخدم واجهة سطر أوامر Docker (CLI) للوصول إليها بدلاً من محاولة تعديل ملفات Docker الداخلية في Finder. يوضح دليل وحدات التخزين في Docker طريقة الاستعادة المعتمدة على الحاويات، بينما تصف نظرة عامة على الشبكات في Docker Desktop جهاز Linux الافتراضي المستخدم على نظام Mac.
قبل الاستعادة: تحقق من الأرشيف ومشروع Compose
تأكد من تشغيل Docker Desktop، ثم افتح تطبيق Terminal وانتقل إلى الدليل الذي يحتوي على ملف Compose الخاص بك. اعثر على الأرشيف في Finder، أو تأكد من اسمه في Terminal. تفترض الأمثلة أدناه أن الملف يحمل الاسم backup.tar داخل مجلد يسمى backup-files؛ قم بتعديل هذه القيم لتطابق ملفاتك.
افحص محتويات الأرشيف قبل استخراجه. يساعدك هذا في تحديد ما إذا كانت الملفات مخزنة مباشرة في جذر الأرشيف أو ضمن دليل رئيسي (parent directory) مثل data/.
tar -tf "$HOME/backup-files/backup.tar" | head -30
يحدد الأمر head العرض بأول 30 مساراً فقط؛ ولا يغير الأرشيف. لاحظ ما إذا كانت المسارات تبدأ ببادئة دليل. ستحتاج إلى استخراج المستوى الصحيح إلى دليل بيانات التطبيق. يستخدم المثال الموثق لدى Docker الخيار --strip 1 لأن أرشيفه يحتوي على دليل ذي مستوى أعلى؛ لا تستخدم هذا الخيار تلقائياً إذا كان الأرشيف الخاص بك لا يحتوي على مثل هذه البادئة. يوضح مثال الاستعادة من Docker كيف يؤثر مسار الاستخراج على التخطيط المستعاد.
تحديد الاسم الدقيق لوحدة التخزين
قد لا يكون مفتاح وحدة التخزين في Compose مثل db-data هو الاسم الكامل لوحدة تخزين Docker. يضيف Compose عادةً اسم المشروع كبادئة، ولكن وحدة التخزين التي تم تكوينها باستخدام name: أو external: true يمكن أن تستخدم اسماً آخر. يشرح مرجع وحدات تخزين Compose خيارات التسمية تلك.
اعرض وحدات التخزين وافحص تكوين Compose لتحديد الوحدة التي تستخدمها خدمتك:
docker volume ls
docker compose config
في تكوين Compose المعروض، ابحث عن تعيين وحدة التخزين (volume mapping) الخاصة بالخدمة والاسم المحلل لوحدة التخزين (resolved volume name). إذا كنت بحاجة إلى فحص وحدة مرشحة، فقم بتشغيل docker volume inspect VOLUME_NAME، مع استبدال VOLUME_NAME بالاسم الفعلي. تأكد من أنها تنتمي إلى المشروع والخدمة المقصودين قبل المتابعة؛ حيث إن الاستعادة إلى وحدة تخزين خاطئة يمكن أن تؤدي إلى الكتابة فوق بيانات غير ذات صلة.
إيقاف عمليات الكتابة واستعادة النسخة الاحتياطية
أوقف خدمات Compose قبل الاستعادة حتى لا يقوم التطبيق بتغيير الملفات أثناء الاستخراج. يؤدي تشغيل docker compose down إلى إيقاف حاويات المشروع وشبكاته وإزالتها؛ وافتراضياً فإنه يحتفظ بوحدات التخزين المسماة. تجنب إضافة -v أو --volumes، لأن ذلك يزيل وحدات التخزين المسماة التي يديرها Compose. يسرد مرجع compose down من Docker هذا السلوك.
docker compose down
قم بتعيين متغير shell على الاسم الدقيق لوحدة التخزين الذي أكدته، ثم استخرج الأرشيف باستخدام حاوية مؤقتة. يستخدم هذا المثال صورة alpine الرسمية، ويقوم بربط مجلد النسخ الاحتياطي للقراءة فقط، ويربط وحدة التخزين المستهدفة عند /restore. استبدل myproject_db-data إذا كان اسمك الفعلي مختلفاً. يجب أن تكون الصورة متاحة محلياً أو يجب أن يكون Docker قادراً على سحبها.
VOLUME_NAME='myproject_db-data'
BACKUP_DIR="$HOME/backup-files"
docker run --rm \
--mount "type=volume,source=$VOLUME_NAME,target=/restore" \
--mount "type=bind,source=$BACKUP_DIR,target=/backup,readonly" \
alpine sh -c 'cd /restore && tar -xf /backup/backup.tar --strip-components=1'
يفترض هذا الأمر أن الأرشيف يحتوي على مستوى دليل مضمَّن واحد، على سبيل المثال data/file.db. إذا أظهرت قائمة الأرشيف الملفات مباشرة في جذره، فقم بإزالة --strip-components=1. إذا كانت المسارات تحتوي على بادئة مشتركة مختلفة، فاختر عدد المكونات التي تريد إزالتها بحيث تستقر ملفات التطبيق المتوقعة مباشرة تحت /restore. تقوم صيغة --mount بربط وحدة تخزين مسماة ودليل مضيف بشكل صريح؛ ويوثق Docker خيارات الربط هذه ونمط الاستعادة في دليل وحدات التخزين.
يستبدل الاستخراج الملفات ذات المسارات المتطابقة ولكنه لا يمسح الملفات غير ذات الصلة الموجودة بالفعل في وحدة التخزين. إذا كنت بحاجة إلى نسخة مطابقة تماماً للنسخة الاحتياطية، فإن الاستخراج بأسلوب الدمج غير كافٍ: قم أولاً بإنشاء نسخة احتياطية منفصلة لوحدة التخزين الحالية، ثم استخدم إجراء تنظيف متعمداً بعد التأكد من الأرشيف والهدف. لا تقم بتشغيل أمر حذف واسع النطاق ضد وحدة تخزين لم تحددها بدقة.
بدء تشغيل المشروع والتحقق من النتيجة
ابدأ تشغيل خدمات Compose مرة أخرى:
docker compose up -d
يعيد Compose استخدام وحدة تخزين موجودة ومصرح بها في المشروع، بينما ينشئ واحدة جديدة إذا كانت مفقودة. يوثق مرجع وحدات تخزين Compose هذا السلوك. تحقق من سجلات الخدمة، واستخدم عمليات التحقق من سلامة التطبيق أو استرداد قاعدة البيانات حيثما ينطبق ذلك. تأكد من وجود السجلات أو الملفات المتوقعة قبل اعتبار عملية الاستعادة مكتملة.
إذا أبلغت الخدمة عن دليل بيانات فارغ، فأعد التحقق من اسم وحدة التخزين، ومسار دليل المضيف، وبنية دليل الأرشيف. تحقق أيضاً من أن الأرشيف متوافق مع إصدار التطبيق وأن نسخته الاحتياطية قد أُخذت في حالة يمكن للتطبيق التعافي منها. الاستخراج الناجح عبر tar يؤكد فقط أنه تم فك حزم الملفات؛ ولا يثبت أن بيانات التطبيق صالحة.
المصادر
Volumes — Docker
docker compose down — Docker
Networking on Docker Desktop — Docker