ما الذي يتسبب في تشغيل المهام المجدولة على المضيف دون تشغيلها داخل الحاوية؟

إيفا وونغ هي كاتبة تقنية و ومهندسة هاوية في ZimaSpace. مهووسة بالتكنولوجيا مدى الحياة ولديها شغف بالمختبرات المنزلية والبرمجيات مفتوحة المصدر، تتخصص في تبسيط المفاهيم التقنية المعقدة إلى أدلة عملية وسهلة الفهم. تؤمن إيفا بأن الاستضافة الذاتية يجب أن تكون ممتعة وليست مخيفة. من خلال دروسها، تمكّن المجتمع من تبسيط إعدادات الأجهزة، بدءًا من بناء أول نظام تخزين شبكي NAS وحتى إتقان حاويات Docker.

تفشل المهام المجدولة داخل الحاوية عندما يختلف برنامج الجدولة أو البيئة أو المستخدم أو الوقت أو مسار التشغيل المطلوب عن سياق المضيف العامل.

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

تأكد من تشغيل عملية جدولة فعلية

افحص العمليات النشطة في الحاوية وأمر بدء التشغيل. لا يؤدي تثبيت حزم cron في الصورة إلى تشغيل البرنامج الخفي، وعادةً ما تشغّل الحاوية نقطة الدخول أو الأمر المهيأ فقط.

تتمحور المناقشة المطوّلة على Stack Overflow حول ضرورة تشغيل برنامج جدولة داخل الحاوية، بدل افتراض أن خدمة المضيف تتحكم في crontab الخاصة بها. العامل الفاصل الأول هو ما إذا كانت عملية cron نشطة عند حلول وقت الجدولة.

إذا لم يكن هناك برنامج جدولة قيد التشغيل، فاختر تصميمًا مقصودًا: شغّل cron أو برنامج جدولة متوافقًا مع الحاويات كعملية في الواجهة الأمامية، أو استخدم حاوية مهام منفصلة، أو استدعِ حاوية التطبيق من cron على المضيف. لا تضف برنامجًا خفيًا ثانيًا غير مُدار من دون تحديد كيفية تسجيله وإيقافه.

شغّل الأمر نفسه باستخدام بيئة دنيا

انسخ الأمر المجدول وشغّله داخل الحاوية كمستخدم المهمة المقصود مع بيئة مجرّدة. سجّل الإخراج القياسي، وإخراج الخطأ، ورمز الخروج، والمجلد الحالي، ومتغيرات البيئة.

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

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

تحقق من PATH والصدفة ومجلد العمل والمستخدم

استبدل الأوامر ومسارات الملفات النسبية بأخرى مطلقة. تأكد من وجود الصدفة المحددة ومن توافق صياغة crontab مع تطبيق cron المثبّت في الصورة.

شغّل المهمة كمستخدم cron المهيأ واختبر صلاحيات القراءة والكتابة والتنفيذ للنصوص البرمجية وملفات الإعداد والمقابس ومجلدات الإخراج. لا يثبت اختبار يدوي بصلاحيات الجذر أن مهمة مجدولة غير ذات امتيازات يمكنها الاكتمال.

حدّد مجلد العمل داخل الأمر أو النص البرمجي المغلّف. إذا نجحت المهمة بعد تغيير المجلد أو المستخدم فقط، فأبقِ هذا السياق محددًا بوضوح في إعدادات خاضعة للتحكم في الإصدارات، بدل الاعتماد على الإعدادات الافتراضية للحاوية.

قارن وقت الحاوية والمنطقة الزمنية بالجدول

اطبع الوقت الحالي والمنطقة الزمنية وموعد التشغيل التالي المقصود داخل الحاوية. تشترك الحاويات في ساعة نواة المضيف، لكنها قد تستخدم UTC أو ملفات مناطق زمنية مختلفة لعرض الوقت وتفسير cron.

توضح حالة على Server Fault كيف يمكن أن يظهر وقت الحاوية في منطقة زمنية أخرى حتى عندما يعرض المضيف الوقت المحلي، مما يجعل crontab صحيحة تعمل في ساعة محلية ظاهرية خاطئة.

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

تحقق من نقاط الربط والأسرار والوصول إلى الشبكة واستمرارية الحاوية

تحقق من وجود كل مجلد إدخال ومسار إخراج وسر ومقبس وملف إعداد داخل الحاوية وقت التشغيل. ثم اختبر الوصول إلى DNS أو قاعدة البيانات أو واجهة API أو NAS من شبكة الحاوية نفسها.

يمكن لـ cron على المضيف رؤية مسارات المضيف غير الموجودة داخل الحاوية. توضّح حالة Nextcloud على Docker كيف قد تبدو مهمة خلفية مهيأة، بينما يمنع أمر الحاوية أو المستخدم أو مسار التطبيق الفعلي التنفيذ الخلفي المتوقع.

تأكد أيضًا من بقاء الحاوية قيد التشغيل عند حلول موعد الجدولة. قد تنهي حاويات التطبيقات قصيرة العمر وعمليات الاستبدال أثناء النشر برنامج جدولة داخليًا قبل اكتمال المهام طويلة التشغيل أو قليلة التكرار.

اختر حدًا واحدًا للجدولة وأثبت تشغيلها دون إشراف

استخدم جهة واحدة تملك الجدولة: cron على المضيف الذي يستدعي docker exec، أو حاوية جدولة مخصصة، أو برنامج جدولة في الواجهة الأمامية داخل صورة التطبيق. قد تؤدي برامج الجدولة المكررة إلى تشغيل مهمة الصيانة نفسها مرتين.

يتناول دليل ZimaSpace حول اختبار DNS من داخل الحاوية أحد الأسباب اللاحقة عندما يبدأ برنامج الجدولة لكنه لا يستطيع الوصول إلى خدمة أخرى.

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

الدعم والنصائح

المزيد للقراءة

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.