تحديد الحاوية قيد التشغيل في صفحة النسخ الاحتياطي من متغيرات البيئة في ملف yml

المقترح: إضافة مكون إضافي (Plugin): discourse-container-names.git

ما الذي تود إنجازه؟

أرغب في إضافة مكون إضافي بسيط يعرض اسم (أسماء) الحاوية (الحاويات) في صفحة النسخ الاحتياطي، على النحو التالي (مثال):

يجب أن يُستمد اسم الحاوية من متغيرات البيئة (environmental variables) في ملف yml، على النحو التالي:

ملاحظات التطبيق:

  1. يجب أن يُستمد اسم الحاوية من متغيرات البيئة كما هو موضح في الصورة أعلاه (وليس من أمر docker ps، على سبيل المثال).

  2. في حالة وجود حاوية بيانات وحاوية تطبيق، سيكون من الجيد عرض اسم حاوية البيانات أيضًا:

  • حاوية: app #مثال بسيط لاسم مستقل
  • حاويات: socket-only, data #مثال بسيط لإعداد حاويتين
  1. السبب في ذلك هو أننا ندير عدة حاويات تطبيقات، وأرغب في معرفة الحاوية النشطة دائمًا عند تصفح صفحات المسؤول، وتحديدًا صفحة النسخ الاحتياطي (وفقًا للصورة الأولى).

متى تحتاج إلى إنجاز هذا العمل؟

في أي وقت. لا عجلة. يبدو هذا إضافة بسيطة جدًا بالنسبة لخبراء إضافات Discourse. إنه مجرد “ميزة مرغوبة” لصفحة النسخ الاحتياطي في لوحة المسؤول، وأنا غير ملهم لكتابته بنفسي، لذا يسعدني دفع مبلغ معقول لشخص ما لتنفيذه!

ما هو ميزانيتك بالدولار الأمريكي التي يمكنك تقديمها لهذه المهمة؟

لا تتردد في مراسلتي عبر الرسائل الخاصة (PM).

يجب أن يكون المكون الإضافي متاحًا مجانًا لمجتمع Discourse ككل في حال وجود مسؤولي أنظمة Discourse آخرين يديرون حاويات متعددة ويرغبون في رؤية اسم الحاوية النشطة حاليًا في صفحة النسخ الاحتياطي في لوحة المسؤول؛ أو لأي شخص يرغب في رؤية اسم الحاوية النشطة لديه (حتى لو كان في وضع مستقل) على صفحة النسخ الاحتياطي.

فكرة رائعة، كيف عن إضافة معرف الحاوية الفعلي أيضًا؟

يمكن البحث عنه من داخل الحاوية بهذه الطريقة:
cat /proc/self/cgroup|grep "systemd:/docker"| awk -F/ '{print $3}'|cut -c1-12

شكرًا لك، لكن الاعتماد على أداة سطر أوامر تعتمد على النظام الأساسي داخل الإضافة للحصول على المعلومات لا يعمل (كما هو مطلوب) بالنسبة لي (فشل استخلاص معرف Docker من الأمر أدناه في بيئة Ubuntu 18.04 الخاصة بنا):

# cat /proc/self/cgroup|grep "systemd:/docker"| awk -F/ '{print $3}'|cut -c1-12

#. (لا توجد نتائج)

حتى هذا الأمر لا يُعطي أي نتيجة:

# cat /proc/self/cgroup|grep "systemd:/docker"

#  (لا توجد نتائج)

لمعلومتك (من أمر docker ps):

CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                  PORTS                               NAMES
63c52bc571b5        local_discourse/socket-only     "/sbin/boot"             28 minutes ago      Up 28 minutes                                               socket-only
631fbabedda9        local_discourse/socket-only2    "/sbin/boot"             26 hours ago        Up 26 hours                                                 socket-only2
123743e12208        mysql/mysql-server              "/entrypoint.sh mysq…"   2 days ago          Up 20 hours (healthy)   33060/tcp, 0.0.0.0:6603->3306/tcp   mysql-man
7a145366268c        registry.unix.com/unix:condor   "/run.sh"                6 days ago          Up 20 hours             3306/tcp, 0.0.0.0:8999->80/tcp      unix
3cc0c90c3e3a        registry:2                      "/entrypoint.sh /etc…"   7 days ago          Up 7 days               0.0.0.0:5000->5000/tcp              hubby
ca7b55fc5a0c        local_discourse/data            "/sbin/boot"             2 weeks ago         Up 8 days                                                   data

هذا يعني أنه يجب استخلاص المعلومة (النص الذي يحدد اسم الحاوية قيد التشغيل) من متغير بيئي في ملف yml. وذلك لضمان أن المعلومة محايدة من حيث النظام الأساسي، ويمكن أن تعمل حتى عند تشغيل حاويات متعددة في آن واحد.

على سبيل المثال، نقوم بتشغيل عدة تطبيقات Discourse وحاويات أخرى في نفس الوقت، وبالتالي فإن استخدام أوامر docker-cli لن يوفر المعلومات الدقيقة التي نحتاجها (اسم الحاوية قيد التشغيل على الويب “في الوقت الفعلي”، والذي تحدده إعدادات وكيل العكس proxy وليس Docker).

نختار الحاوية التي سيتم عرضها عن طريق تغيير اسم منفذ Unix socket (أو منفذ الحاوية المكشوف) في إعدادات وكيل العكس، مما يسمح لنا بالتبديل بين الحاويات في أقل من ثانية دون أي توقف. وهذا يعني أن اسم الحاوية يجب (يجب بالضرورة) أن يأتي من متغير بيئي في ملف yml ليكون موثوقًا ودقيقًا بنسبة 100%.

لذلك، فإن مطلبنا هو أن يأتي النص (اسم الحاوية، معرف الحاوية، إلخ) فقط من المتغيرات البيئية في ملف yml.

بالنسبة لأي شخص يفضل استخدام معرف الحاوية، يمكنه إضافته إلى متغيره البيئي بهذه الطريقة (كمثال):

DISCOURSE_APP_CONTAINER_NAME = 'socket-only (63c52bc571b5)'

أو حتى:

DISCOURSE_APP_CONTAINER_NAME = '63c52bc571b5'
DISCOURSE_DATA_CONTAINER_NAME = 'ca7b55fc5a0c'

وبحسب منشوري الأصلي (الطريقة التي نريد استخدامها):

DISCOURSE_APP_CONTAINER_NAME = 'socket-only'
DISCOURSE_DATA_CONTAINER_NAME = 'data'

وسيتم تحديد أي معرف (اسم، معرف حاوية، أو كليهما) بناءً على متطلبات مسؤول النظام (أو المؤسسة).

لهذا السبب كنت محددًا في التأكيد على أن المعلومة يجب أن تُدمج يدويًا في ملف yml الرئيسي كتغير بيئي (وليس من أوامر سطر الأوامر مثل docker ps أو أوامر النظام الأساسية الأخرى).

أتمنى أن يكون هذا قد جعل مطلبًا أكثر وضوحًا.

أريد أن يكون هذا محايدًا من حيث النظام الأساسي والإعدادات، وغير معتمد على أوامر سطر الأوامر أو أوامر النظام. نحن نستخدم Docker للعديد من التطبيقات الأخرى وليس فقط Discourse على خوادمنا (بما في ذلك Discourse، وتطبيقات LAMP المعبأة بـ Docker، وسجلات Docker الخاصة، وغيرها، كما يمكنكم ملاحظته من مخرجات أمر docker ps أعلاه).

أنت محق تمامًا!

مرحبًا @RGJ،

فكرة متابعة واحدة فقط:

الحالة الحدية التي قد لا يعمل فيها ترميز معرّفات الحاويات بشكل ثابت (سواء كان معرف الحاوية، أو اسمها، أو كليهما) كمتغيرات بيئة في ملفات YAML، هي في Docker Swarm أو Kubernetes (كمثال)؛ لأنه عندما تكون الحاويات ديناميكية بناءً على الحمل و/أو الأعطال، فإن ترميز متغيرات البيئة بشكل ثابت في ملفات YAML لن يعمل (أفترض ذلك، لكنني لم أقم بذلك بعد لأتحدث بسلطة في هذا الشأن)؛ لكنني مستعد للمضي قدمًا في “النهج البسيط” حاليًا (متغيرات البيئة في ملفات YAML).

على أي حال، لم أقوم بعد بنشر Discourse مع Swarm أو Kuber، لذا كانت خطتي عبور هذا الجسر عندما أصل إليه لاحقًا :slight_smile:

لقد فكرت كثيرًا في هذا الأمر، ولهذا السبب قررت أن أفضل مسار في هذه المرحلة هو المضي قدمًا مع متغيرات بيئة Discourse المرمزة بشكل ثابت في ملف (ملفات) YAML.

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