إذا اختفت الملفات التي يُفترض أن تأتي من صورتك بعد تنفيذ docker compose up على نظام macOS، فتحقق مما إذا كانت هناك نقطة تثبيت ربط (bind mount) تغطي دليل الحاوية الخاص بها. فنقطة تثبيت الربط تجعل محتويات مجلد المضيف مرئية في موضع التثبيت المستهدف، مما يحجب الملفات الموجودة بالفعل داخل الصورة. حدد التعيين المحدد، وصحح مسار المضيف أو الحاوية الخاص به — أو قم بإزالته إذا لم يكن ضروريًا — ثم أعد إنشاء الخدمة المتأثرة. توضح وثائق Docker أن إعادة إنشاء الحاوية بدون نقطة التثبيت هي الطريقة لإظهار ملفات الصورة الأصلية مجددًا. (Bind mounts)

لماذا تخفي نقطة تثبيت الربط الملفات؟

تقوم نقطة تثبيت الربط (bind mount) بربط مسار على المضيف بمسار داخل الحاوية. على سبيل المثال، يؤدي تثبيت ./app:/usr/src/app إلى ظهور مجلد app الخاص بالجهاز المضيف داخل المسار /usr/src/app. إذا كانت الصورة تحتوي بالفعل على ملفات هناك، فستظل جزءًا من الصورة ولكنها ستكون مخفية طالما كان التثبيت نشطًا. قد يتسبب هذا في جعل الصورة الصالحة للعمل تبدو فارغة أو يؤدي إلى أخطاء أثناء بدء التشغيل عند حجب البرنامج المتوقع تشغيله. ينطبق السلوك نفسه على Mac؛ حيث يتولى Docker Desktop إدارة الوصول إلى ملفات المضيف من خلال جهازه الافتراضي الذي يعمل بنظام Linux. (Bind mounts)

يختلف هذا الأمر عن مشكلات أذونات الملفات: فقد تقرأ الحاوية الدليل المثبت بشكل صحيح، ولكنها تقرأ مجموعة ملفات مختلفة عن تلك الموجودة في دليل الصورة. تحقق من التعيين (mapping) قبل محاولة تغيير الملكية أو إعادة بناء الصورة.

العثور على التعيين في ملف Compose الخاص بك

افتح ملف Compose المستخدم لبدء المشروع وحدد مدخلات volumes: الخاصة بالخدمة المتأثرة. يُعتبر الإدخال بالصيغة المختصرة مثل ./app:/usr/src/app نقطة تثبيت ربط إذا كان مصدره مسارًا على المضيف. في Compose المحلي، يتم تحديد المسار المصدري النسبي استنادًا إلى الدليل الأصلي لملف Compose. وهذا يعني أن ./app قد يشير إلى مجلد مختلف عما تتوقعه إذا كان ملف Compose موجودًا داخل دليل فرعي. (Compose services reference)

لعرض التكوين الذي تم تحليله وحالة الخدمة، قم بتشغيل هذه الأوامر من دليل المشروع في شاشة Terminal على macOS:

docker compose config
docker compose ps

في التكوين المعروض، قارن بين الـ source لكل نقطة تثبيت (المسار على Mac) والـ target (المسار داخل الحاوية). بعد ذلك، قارن الهدف مع دليل العمل (working directory) الخاص بالصورة والدليل الذي يُتوقع وجود ملفات التطبيق داخله. يمكن لنقطة تثبيت شاملة مثل .:/usr/src/app أن تغطي دليل التطبيق بأكمله؛ بينما يترك التعيين الأكثر تحديدًا مثل ./config:/usr/src/app/config بقية ملفات دليل الصورة ظاهرة ومرئية.

اختيار الحل المناسب

إذا كانت الخدمة بحاجة إلى الوصول المباشر والفوري إلى الشفرة المصدرية، فاحتفظ بنقطة تثبيت الربط ولكن وجّهها إلى مجلد المضيف الصحيح والدليل الفرعي المقصود داخل الحاوية. تأكد من أن مجلد المضيف يحتوي بالفعل على الملفات التي تتوقعها. تؤدي الصيغة المختصرة في Compose إلى إنشاء دليل في حال كان مسار المصدر غير موجود، لذلك يمكن لأي خطأ إملائي أن يزود الحاوية بمجلد فارغ دون تنبيهك. وللتحكم الدقيق والصريح، استخدم الصيغة المطوّلة مع تعيين create_host_path: false؛ وحينها سيقوم Compose بالإبلاغ عن فقدان المصدر بدلاً من إنشاء دليل فارغ. (Compose services reference)

services:
  app:
    volumes:
      - type: bind
        source: ./app
        target: /usr/src/app
        bind:
          create_host_path: false

إذا كان المفترض أن توفر الصورة نفسها ملفات التطبيق، فاحذف نقطة التثبيت التي تستهدف ذلك الدليل. وإذا كانت ملفات الإعدادات فقط أو مجلد واحد يتم إنشاؤه يحتاج إلى الوصول من المضيف، فقم بتثبيت ذلك الدليل الفرعي فقط. بالنسبة لبيانات الحاوية الدائمة مثل قواعد البيانات، فكّر في استخدام وحدة تخزين مسماة (named volume) بدلاً من ذلك: حيث يتولى Docker إدارة وسائط التخزين الخاصة بها، ويتجنب ربط تلك البيانات بمجلد معين على جهاز Mac. (Volumes)

إعادة إنشاء الخدمة والتحقق

بعد تعديل ملف Compose، أعد إنشاء الخدمة المتأثرة حتى تستخدم نقاط التثبيت المحدثة. استبدل app أدناه باسم الخدمة الموجود في ملفك:

docker compose up -d --force-recreate app
docker compose exec app sh -c 'ls -la /usr/src/app'

يتحقق الأمر ls مما يمكن للحاوية رؤيته في المسار المستهدف؛ قم بتغيير المسار إذا كانت خدمتك تستخدم مسارًا مختلفًا. إذا كانت الصورة لا تحتوي على صدفة (shell) أو تفتقر إلى أمر ls، فافحص سجلات بدء التشغيل الخاصة بها باستخدام docker compose logs app واستخدم أمرًا تشخيصيًا متاحًا داخل تلك الصورة. تشير وثائق Docker أيضًا إلى استخدام docker inspect للتحقق من مصدر ووجهة تثبيت الحاوية؛ وعند استخدام Compose، احصل أولاً على اسم الحاوية من خلال docker compose ps، ثم شغّل الأمر docker inspect CONTAINER_NAME. (Bind mounts)

إذا كان المصدر يقع خارج المجلدات المشتركة لـ Docker Desktop، أو ظهرت لك رسائل مثل Mounts denied أو file is not shared from the host، فتحقق من Settings > Resources > File sharing داخل Docker Desktop وأضف دليل Mac المعني. يُدرج Docker المسارات /Users و/Volumes و/private و/tmp و/var/folders على أنها مشتركة افتراضيًا، ولكن الأدلة الموجودة خارج هذه المواقع قد تتطلب إضافتها يدويًا. لا يدعم Docker VMM المشاركة التلقائية لنقاط تثبيت الربط، لذا يلزم إضافة الدليل يدويًا عند استخدام هذه البيئة الخلفية. (Docker Desktop settings، Virtual Machine Manager)

عادةً ما يتم إصلاح نقطة التثبيت التي تحجب ملفات الصورة عن طريق تصحيح مصدرها أو هدفها، أو تضييق نطاقها، أو إزالتها وإعادة إنشاء الخدمة. احتفظ بنقطة تثبيت الربط عندما تحتاج الحاوية إلى مجلد مضيف محدد؛ وبخلاف ذلك، دع الصورة توفر ملفاتها الخاصة أو قم بتخزين البيانات الدائمة في وحدة تخزين يديرها Docker.

المصادر