هناك بالفعل مواد على Habr كيفية تكوين حاوية قفص الاتهام لتجميع المشروع. على سبيل المثال ، استخدام Docker لإنشاء وتشغيل مشروع C ++ . في هذه المقالة ، كما في المقالة السابقة ، سيتم النظر في مسألة بناء المشروع ، لكن هنا أود أن أتجاوز البرنامج التعليمي وأنظر بشكل أعمق في قضايا استخدام الحاويات في مثل هذه المهام ، وكذلك بناء البنية التحتية للبناء مع عامل ميناء .
قليلا عن عامل ميناء
لتوضيح المزيد من المناقشة ، من الضروري تقديم وصف لبعض مكونات عامل الميناء .
صورة
صورة Docker هي قالب للقراءة فقط مع تعليمات لإنشاء حاوية. لبناء الصورة ، تحتاج إلى إنشاء Dockerfile ، الذي يصف جميع خطوات التجميع. كل خطوة من هذا القبيل تخلق طبقة منفصلة داخل الصورة . يتم تثبيت كل طبقة لاحقة فوق كل الطبقات السابقة ولا تحتوي إلا على التغييرات التي يجب إجراؤها على الطبقة السابقة.
على سبيل المثال ، للحصول على Dockerfile :
FROM ubuntu:18.04 ADD app.sh /app ENTRYPOINT /bin/bash /app/app.sh
سوف يكون صورة عامل ميناء الهيكل التالي:

يتم تخزين الطبقات الموجودة داخل الصورة مؤقتًا ويمكن إعادة استخدامها في حالة عدم اكتشاف أي تغييرات. إذا تم تغيير الطبقة (تمت إضافتها / حذفها) ، فسيتم إنشاء كل الطبقات التالية من نقطة الصفر. لإجراء تغييرات على صورة الحاوية (وبالتالي ، على بيئة العملية التي تم إطلاقها) ، يكفي إصلاح Dockerfile والبدء في بناء الصورة.
حاوية
حاوية عامل الإرساء هي نسخة بدء تشغيل للصورة . يمكن إنشاؤه أو بدء تشغيله أو إيقافه أو حذفه ، إلخ. افتراضيًا ، يتم عزل الحاويات عن بعضها البعض وعن النظام المضيف. في البداية ، تبدأ الحاوية في أمر ، والذي يمكن تحديده في ENTRYPOINT أو CMD ، ويتوقف عند اكتماله. الموقف المقبول هو عندما يكون كل من CMD و ENTRYPOINT حاضرين ، أثناء تفاعلهما الموصوف في الوثائق .
عند إنشاء كل حاوية ، تتم إضافة طبقة جديدة فوق كل تلك الموجودة. إنه قابل للكتابة في الحاوية الحالية ، ويتم إتلافه مع الحاوية. يتم تطبيق جميع عمليات الكتابة ، وإنشاء ملفات جديدة أثناء تشغيل الحاوية على هذه الطبقة ، تبقى الصورة دائمًا دون تغيير. وبالتالي ، ستبدو بنية طبقة الحاوية التي تم إنشاؤها:

عند استخدام docker run
، سيتم إنشاء حاوية جديدة في كل مرة ، مع طبقة خاصة للكتابة. في إنشاء المهام ، يعني هذا أنه في كل مرة يبدأ ، سيخلق بيئة نظيفة جديدة لا علاقة لها بعمليات الإعدام السابقة. يمكن عرض قائمة الحاويات التي تم إنشاؤها عن طريق تشغيل الأمر: docker container ls -a
.
نحن نجمع المشروع في الحاوية
من أجل التوضيح ، نصف بإيجاز عملية إنشاء تطبيق في حاوية ؛ ويرد وصف هذه العملية بمزيد من التفصيل في المادة 1 والمادة 2 .
يمكن تمثيل الخطوات الممكنة تخطيطيًا لإنشاء التطبيق في عامل ميناء على النحو التالي:

دعنا نحلل الخطوات الموضحة:
- نستخدم Dockerfile ، الذي يصف البيئة ، والأوامر لتجميع ونسخ النتائج ، وبناءً عليه ، نقوم بإنشاء صورة للحاوية.
- نحن نستخدم الصورة الناتجة لإنشاء الحاوية
docker run
. نقوم بتحميل المجلد المصدر والمجلد حيث سيتم نسخ نتيجة التجميع إلى الحاوية. - بعد اكتمال الحاوية ، سيتم وضع القطع الأثرية للتجميع في الدليل المثبت.
ويرد مثال في المقال .
نظرًا لاستخدام docker run
هنا ، في كل عملية إطلاق ، سيتم إنشاء حاوية منفصلة بطبقتها الخاصة للكتابة ، وبالتالي لن تدخل الملفات المؤقتة من التجميعات السابقة في المجموعة الحالية. تذكر لتنظيف الحاويات توقف.
تحميل الدليل المصدر يجعل تصحيح التجميع أسهل. ولكنه ينطوي على مخاطر - يمكنك جمع إصدار من التعليمات البرمجية التي لم تخضع لمراقبة الجودة ، أو لا تتم إضافتها إلى نظام التحكم في الإصدار على الإطلاق. لتجنب ذلك ، يمكنك استنساخ مستودع git داخل الحاوية في كل بناء ، على سبيل المثال ، في الملف :
FROM ubuntu:bionic RUN apt-get update \ && apt-get install -y apt-utils RUN apt-get update \ && apt-get install -y make gcc g++ qt5-default git RUN mkdir -p /app/src WORKDIR /app/build # ENTRYPOINT git -C /app/src clone https://github.com/sqglobe/SimpleQtProject.git \ && qmake /app/src/SimpleQtProject/SimpleQtProject.pro \ && make \ && cp SimpleQtProject /app/res/SimpleQtProject-ubuntu-bionic
هنا ، يتم الاستنساخ في ENTRYPOINT
، وليس في بيان RUN
، بسبب التخزين المؤقت. يتم تنفيذ ENTRYPOINT
دائمًا عند بدء تشغيل الحاوية ، ويمكن أخذ نتيجة الأمر RUN
من ذاكرة التخزين المؤقت .
بناء البنية التحتية
لإنشاء مشروع لأنظمة تشغيل مختلفة أو توزيعات Linux ، يمكن استخدام تكوين معين من الخوادم (آلات البناء والخوادم بنظام التحكم في الإصدار ، وما إلى ذلك). في الممارسة العملية ، كان علي التعامل مع البنية التحتية التالية:

هنا ، يصل المستخدم إلى خادم الويب الذي تم بناء المشروع من خلاله على أجهزة مع Ubuntu و Red Hat . بعد ذلك ، على كل جهاز ، يتم استنساخ مستودع git مع المشروع في دليل مؤقت ويبدأ التجميع. يمكن للمستخدم تنزيل الملفات الناتجة من نفس الصفحة التي بدأ منها العملية بأكملها.
هذا التجميع قابل للتكرار لأن المطورين يستخدمون نفس البيئة.
من السلبيات - من الضروري الحفاظ على بنية أساسية كاملة ، وإدارة عدة خوادم ، والقضاء على الأخطاء في البرامج النصية وتطبيقات الويب ، إلخ.
تبسيط مع عامل ميناء
يتطلب دعم البنية التحتية الموضحة أعلاه تكاليف معينة ، مالية وبشرية. إذا كان فريقك يعمل على بدء تشغيل صغير ، أو كنت المطور الوحيد ، فيمكنك استخدام حاويات الإرساء لتنفيذ البنية الأساسية للبناء.
النظر في مشروع كيو تي تافهة التي بنيت باستخدام qmake - SimpleQtProject . يحتوي مجلد عامل ميناء المشروع المحدد على عدد من الملفات:
تقوم هذه الملفات بتطبيق فكرة استنساخ الكود المصدري داخل الحاوية.
يتم إطلاق التجميع بأكمله باستخدام Makefile . انها قصيرة جدا وتحتوي على ما يكفي من التعليقات. أساسها هو إنشاء صورة وإطلاق الحاوية:
%: %.docker docker build -t simple-qt-$(strip $(subst .docker,, $< )) --file $< . docker run --mount type=bind,source=$(RELEASE_DIR),target=/app/res simple-qt-$(strip $(subst .docker,, $< ))
في هذه المرحلة من التجميع ، يتم إنشاء صورة الحاوية باسم يتكون من بادئة بسيطة- qt- واسم النظام (بالنسبة إلى centos 7 ، ستكون بسيطة - qt-centos7 ). كما Dockerfile ، يتم استخدام الملف المقابل مع إذن .docker . بعد ذلك ، يتم تشغيل الحاوية استنادًا إلى الصورة التي تم إنشاؤها ، ويتم تثبيت مجلد عليها لنسخ قطع أثرية للتجميع.
بعد تشغيل make
في دليل docker ، سيحتوي مجلد docker / release على نتائج الإنشاء للعديد من الأنظمة الأساسية.
وبالتالي ، فإن البنية التحتية لدينا لبناء SimpleQtProject ستبدو كما يلي:

مزايا هذا التكوين:
- محلية . يجمع المطور مشروعًا لعدة منصات على جهازه المحلي ، مما يلغي الحاجة إلى احتواء أسطول من الخوادم وتكوين نسخ الأعمال الفنية بين الخوادم عبر الشبكة وإرسال أوامر الشبكة ومعالجتها.
- عزل البيئة . توفر الحاوية بيئة معزولة تمامًا لبناء تطبيق معين. من الممكن إنشاء مشاريع ذات بيئات غير متوافقة على نفس الجهاز (على سبيل المثال ، تلك التي تتطلب إصدارات مختلفة من نفس المكتبة).
- الإصدارات. عن طريق وضع Dockerfile في مستودع git ، يمكنك تتبع التغييرات في بيئة الإنشاء من خلال إصدار إصدارات جديدة ، والعودة إلى الإصدارات السابقة من بيئة البناء ، إلخ.
- التنقل . إذا لزم الأمر ، يتم نشر هذه البنية التحتية دون أي مشاكل على كمبيوتر آخر. تتيح لك تقنية إنشاء صورة حاوية إجراء تغييرات على الصورة نفسها بسهولة شديدة - ما عليك سوى تحديث Dockerfile والبدء في إنشاء الصورة.
- التوثيق الذاتي . بشكل أساسي ، يحتوي Dockerfile على خطوات لنشر بيئة تجميع. لذلك ، إذا لزم الأمر ، نشر مثل هذه البيئة ، ولكن بالفعل في نظام منتظم ، يمكنك استخدام الأوامر منه.
- خفة . تبدأ الحاوية في لحظة بدء التجميع وتوقفه تلقائيًا عند الانتهاء. لا تضيع الوقت وحدة المعالجة المركزية وذاكرة الوصول العشوائي.
ومع ذلك ، هناك ناقص كبير - سيتطلب تجميع المشروع تجميع صورة الحاوية. عند البدء لأول مرة ، قد يستغرق الأمر وقتًا طويلاً. ولكن مع تلك المتكررة ، خاصة إذا لم يتغير Dockerfile ، يتم تجميع الصورة باستخدام ذاكرة التخزين المؤقت عدة مرات بشكل أسرع.
من الضروري أيضًا تذكر تنظيف الحاويات التي تم إيقافها.
استنتاج
في الختام ، أود أن أشير إلى أن عامل الإرساء ليس هو تقنية الحاويات الوحيدة. ولكن هناك بعض الميزات التي تميزها بشكل إيجابي عن مهام التجميع من LXC نفسها:
- يمكنك إنشاء حاوية باستخدام نص Dockerfile . هذا ملف به بناء جملة بسيط ، ويمكنك إضافته إلى مستودع المشروع (كما أفعل دائمًا) والاحتفاظ به باستمرار.
- في كل مرة ، من خلال إطلاق حاوية الإرساء باستخدام
docker run
نحصل على بيئة نظيفة ، كما لو كنا نفعل كل شيء لأول مرة. لا يتم حفظ الملفات المؤقتة بين التجميعات. - لا تطلق الحاوية نظام التشغيل بالكامل ، ولكن فقط عملية التجميع الضرورية.