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