محاولة فهم launcher كسلسلة من أوامر Docker

أنا أحاول فهم أوامر Docker التي يصدرها برنامج التشغيل (launcher).

يتطلب هذا أيضًا فهم أوامر bash الأخرى الموجودة في السكربت. وبما أنني لست خبيرًا في bash، فقد اضطررت إلى إجراء بعض الأبحاث لفهم بعض الأجزاء. عادةً ما أقرأ الكود وأحلل الأمر يدويًا ثم أجربه للتأكد، على سبيل المثال:

docker info 2> /dev/null

أحيانًا تكون بعض الأسطر أكثر تعقيدًا، فأقوم بتشغيل أمر مكافئ، مثل:

test=$(($(stat -f --format="%a*%S" /var/lib/docker)/1024**3 < 5)); echo $test

الدالة الفرعية التي أعمل عليها حاليًا هي host_run()، ولا أعرف من أين يأتي المدخلات لهذه الدالة.

https://github.com/discourse/discourse_docker/blob/master/launcher#L259-#L287.

يمكنني الآن طرح العديد من الأسئلة خلال الأيام القليلة القادمة، أو إضافة عبارات echo في نسخة معدلة من launcher، لكن يجب أن يكون هناك شيء أفضل من ذلك.

هل توجد طريقة مثل أمر script التي ستلتقط أوامر Docker الداخلية التي يتم تنفيذها وتسجيلها في ملف؟

تعديل

يبدو أن هذا يعمل. انظر: تصحيح أخطاء سكربتات Bash

فقط استخدم خيار bash -x، على سبيل المثال:

groot@galaxy:/var/discourse$ sudo bash -x launcher start app

لتسجيل هذا في ملف:

  1. أنشئ مجلدًا لتخزين التتبعات. يتم إنشاؤه تحت المسار ~ لتجنب مشاكل الصلاحيات.
groot@galaxy:/var/discourse$ mkdir ~/traces
  1. قم بتشغيل أمر bash المطلوب. الحيلة هنا هي أن مخرجات التتبع لا تذهب إلى stdout، بل إلى stderr، لذا استخدم 2> بدلاً من > الذي هو في الواقع 1>.
groot@galaxy:/var/discourse$ sudo bash -x launcher start app 2> ~/traces/start_01
  1. قم بتصفية الملف لعرض الأسطر التي تحتوي على أمر docker.
groot@galaxy:/var/discourse$ grep /usr/bin/docker ~/traces/start_01

مثال على المخرجات:

+ docker_path=/usr/bin/docker
+ '[' -z /usr/bin/docker ']'
++ /usr/bin/docker info
+ /usr/bin/docker info
++ /usr/bin/docker --version
++ /usr/bin/docker images
++ /usr/bin/docker run -i --rm -a stdout -a stderr discourse/base:2.0.20200512-1735 echo working
++ /usr/bin/docker info --format '{{.DockerRootDir}}'
+ '[' -z /usr/bin/docker ']'
++ /usr/bin/docker --version
++ /usr/bin/docker ps
++ /usr/bin/docker ps -a
+ /usr/bin/docker start app

قد يبدو ذلك وكأنه عدد كبير جدًا من أوامر Docker أكثر مما هو متوقع، لكن launcher يقوم بالكثير من عمليات التحقق من النزاهة التي كان عليك القيام بها يدويًا. وهذا يقنعني باستخدام launcher للمهام الروتينية التي تم إنشاؤه من أجلها.