البرمجة

مشكلة تنفيذ ملف docker-entrypoint في دوكر

في البداية، دعوني أشير إلى الرسالة التي تظهر عند تشغيل السكربت:

“standard_init_linux.go:175: exec user process caused ‘no such file or directory'”

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

عند فحص الـ Dockerfile وسكربت الـ entrypoint، يبدو أن كلاهما في حالة جيدة، والأمر الذي يثير الاستفسار هو كيفية تنفيذهما.

في المثال الذي لا يعمل، يتم تحديد الـ entrypoint باستخدام السكربت مباشرة، ولكن عند التشغيل، يظهر الخطأ المذكور.

ومن الجدير بالذكر أن الـ entrypoint في المثال الذي يعمل يتم تحديده بشكل مباشر كأمر بدلاً من تشغيل سكربت خارجي.

ربما يكون السبب الرئيسي وراء هذا الفشل هو تنسيق نهاية السطر لملف الـ entrypoint. في بيئة Linux، يجب أن يكون تنسيق نهاية السطر للسكربتات النصية في Unix مثل LF (Line Feed) بينما يستخدم Windows CR/LF (Carriage Return/Line Feed). هذا قد يؤدي إلى تحقق النظام من مسار الملف الذي لا يزال يحتوي على CR في نهاية السطر، مما يؤدي إلى فشل العثور على الملف.

لتصحيح هذا، يجب تغيير تنسيق نهاية السطر في ملف الـ entrypoint إلى LF. يمكن استخدام أوامر مثل dos2unix لتغيير التنسيق.

بالإضافة إلى ذلك، يمكن تشغيل أمر file للتحقق من تنسيق نهاية السطر للملف:

bash
file -bi /docker-entrypoint.sh

إذا كان التنسيق هو text/plain; charset=us-ascii, فهذا يعني أنه لا يزال يحتوي على تنسيق نهاية السطر من Windows.

بتغيير التنسيق ليكون LF، يجب أن يعمل الـ entrypoint كما هو متوقع، ويتم تنفيذ السكربت بنجاح داخل الحاوية دوكر.

المزيد من المعلومات

بالطبع، إليك المزيد من المعلومات لفهم السياق وتصحيح المشكلة:

عند إنشاء سكربت الـ entrypoint في بيئة Windows وحفظه باستخدام محرر نصوص مثل Notepad، قد يتم حفظ التنسيق الافتراضي لنهاية السطر CR/LF. على الجانب الآخر، في بيئة Linux، يفترض أن تكون نهاية السطر LF فقط. تواجد CR في نهاية السطر يمكن أن يؤدي إلى مشاكل عند محاولة تشغيل السكربت في بيئة Linux، مما يتسبب في رسالة الخطأ التي رأيناها.

تغيير التنسيق ليتناسب مع البيئة اللينكسية يمكن تحقيقه بسهولة باستخدام أدوات مثل dos2unix. يمكن استخدام الأمر التالي لتحويل التنسيق:

bash
dos2unix /docker-entrypoint.sh

بعد ذلك، يمكن إعادة تشغيل الحاوية دوكر لتحديث التغييرات ومحاولة تشغيل السكربت مرة أخرى. بافتراض أن كل الأوامر الأخرى في Dockerfile تم تنفيذها بنجاح، يجب أن يعمل الـ entrypoint كما هو متوقع وتظهر رسالة “Hello World!” كنتيجة.

زر الذهاب إلى الأعلى