حاوية VPN تتوقف عند 'exec format error': منصة خاطئة
تعني 'exec format error' أن الملف الثنائي بُني لمعالج آخر، لا أن NET_ADMIN مفقود. اقرأ فهرس الصورة قبل تعديل المسارات أو بيانات الاعتماد.
الحاويات التي تخرج فورًا مع exec format error تستدعي الحدس الخاطئ: إضافة قدرة، أو تركيب جهاز، أو تعديل إعداد النفق. لا شيء من ذلك يصل إلى المشكلة. لم يستطع النواة تنفيذ الملف الثنائي على الإطلاق، وهذا يعني في حاوية دائمًا تقريبًا أن الصورة تستهدف بنية معالج مختلفة عن المضيف. كل ما قد تغيّره في التوجيه أو بيانات الاعتماد أو الصلاحيات يحدث بعد أن يبدأ برنامج، ولم يبدأ أي برنامج.
رسالة البدء التي تبدو كخطأ في الإعداد
يأتي فشل تنسيق exec من المحمّل، قبل أن يقرأ التطبيق أي إعداد. ولهذا لا ينتج أي تحذيرات إعداد ولا سجل نفق، لأنه لا توجد عملية حيّة تكتبها. الفشل سريع بشكل ملحوظ أيضًا، وغالبًا قبل ظهور أي سطر في سجل الحاوية. تظهر الرسالة القصيرة نفسها سواء كان الملف الثنائي لبنية أخرى أو لنظام تشغيل آخر أو تالفًا.
سجّل بيئة التشغيل والبنية إلى جانب مرجع الصورة الدقيق، ثم تحقّق مما يقدمه ذلك المرجع فعليًا. على Docker Desktop تنتمي منصة الحاوية إلى الآلة الافتراضية Linux لا إلى الحاسوب المحمول، لذا قد تضلّل بنية المضيف وحدها. اقرأ قائمة إدخالات الفهرس لهذا المرجع بدلًا من نص التسويق في صفحة الوسم.
اقرأ فهرس الصورة قبل أمر التشغيل
عندما ينشر سجل ما مرجعًا متعدد المنصات، يشير الوسم إلى فهرس، ويسمّي كل إدخال منصة ببصمتها الخاصة. افحص المرجع قيد المراجعة لا وسمًا مجاورًا، واقرأ الفهرس بدلًا من افتراض محتواه.
docker buildx imagetools inspect ghcr.io/example/vpn:1.4
docker image inspect --format '{{.Os}}/{{.Architecture}}' ghcr.io/example/vpn:1.4
يسرد الأمر الأول المنصات التي ينشرها المرجع. يُبلِغ الثاني عن منصة الصورة الموجودة محليًا بالفعل، وهي ما سيشغّله وقت التشغيل. مرجع بإدخال واحد فقط يعني أن كل مضيف يتلقى الملف الثنائي نفسه، ولا يمكن للوسم مساعدة آلة لم يُبنَ لها قط.
الوسوم تختار نسخة؛ ولا تنشئ واحدة
يتيح فهرس متعدد المنصات لوقت التشغيل اختيار إدخال مطابق، وهو أمر مريح حقًا ويُخطئ كثيرًا في اعتباره قابلية نقل. الاختيار بحث، وليس ترجمة: إذا غابت النسخة، فلا شيء للاختيار. لذلك قد يحل الوسم نفسه على مضيفين إلى ملفين ثنائيين مختلفين، وعلى مضيف واحد لا يحل إلى شيء صالح.
التثبيت بالبصمة يزيل الغموض، ويجعل المراجعة اللاحقة ممكنة أيضًا، لأن البصمة تحدد بالضبط البايتات التي جرى اختبارها. احتفظ بتلك البصمة مع سجل النشر بدلًا من الاعتماد على الوسم الذي صادف أنه الحالي.
المحاكاة ترتيب، لا طبقة ترجمة
يمكن للمحاكاة عبر وقت تشغيل مدعوم تشغيل بعض أحمال مساحة المستخدم غير الأصلية، لذا فإن الادعاء المطلق بأن بنية واحدة لا تستطيع أبدًا تشغيل صورة أخرى خاطئ. وهي أيضًا ليست حلًا عامًا. للتنفيذ المحاكى خصائص أداء مختلفة، وعملية تافهة تبدأ لا تخبرك بشيء عن سلوك حمل نفق بشكل مقبول.
يعامل دليل المنصات المتعددة في Docker البناء الأصلي والترجمة المتقاطعة والمحاكاة كاستراتيجيات منفصلة، وهذه هي الطريقة الصحيحة لقراءة الخيارات. اختر واحدة عن قصد، وقيّم حمل VPN في ظلها بدلًا من افتراض التكافؤ.
الصلاحيات تحل مشكلة مختلفة
منح قدرة إدارة الشبكة أو تمرير جهاز TUN لا يمكن أن يجعل ملفًا تنفيذيًا غير متوافق يعمل. هذه صلاحيات وقت تشغيل تستخدمها عملية قائمة؛ وهي غير مرئية لمحمّل رفض الملف بالفعل.
والعكس صحيح بالقدر نفسه. الملف الثنائي الأصلي لا يثبت شيئًا عن الصلاحيات أو الوصول إلى الأجهزة أو تكامل المحلل أو سياسة إعادة التشغيل التي يحتاجها النفق، لذا الحاوية التي تبدأ ليست بعد حاوية تعمل. أنشئ عقد المنصة أولًا، ثم انتقل إلى عقد وقت التشغيل بخياراته الموثقة.
احفظ بصمة الصورة والهدف المدعوم والإعداد معًا في السجل نفسه. تحديث وسم يغيّر البنية بصمت أسهل اكتشافًا عندما تكون البصمة السابقة مكتوبة مما هو عندما يكون العَرَض الوحيد خطأً مألوفًا وبعد ظهر جديدًا من التصحيح.