كيفية استخدام Docker Buildx Bake لإنشاء خطوط أنابيب بناء صورة معقدة

نشرت: 2022-08-10

رسم يظهر شعار Docker

تستخدم مجموعة أوامر docker buildx buildx BuildKit لعرض قدرات بناء الصورة المتقدمة. تعد الإنشاءات المخبوزة ميزة عالية المستوى يمكن استخدامها لتحديد خطوط أنابيب البناء المؤتمتة. إنها تتيح لك إنتاج صور متعددة من عملية بناء واحدة.

تكون مهام سير العمل المخبوزة مفيدة عندما تريد نشر أشكال مختلفة من صورك أو إنشاء عدة مشاريع مرتبطة بالتوازي. في هذه المقالة ، سنغطي الميزات الرئيسية docker buildx bake وكيف يمكنك استخدامها لتبسيط الإنشاءات المعقدة.

ابدء

يقوم أمر docker buildx bake بتنفيذ "أهداف" بناء متعددة ينتج كل منها صورة حاوية. تعمل الأهداف بالتوازي قدر الإمكان لتحقيق أقصى قدر من الأداء. قد تشير الأهداف أيضًا بشكل مباشر إلى أسلافها لإنشاء خطوط أنابيب متسلسلة.

يمكن تحديد أهداف البناء باستخدام عدة آليات مختلفة بما في ذلك ملفات Docker Compose الحالية. سيقوم Buildx تلقائيًا ببناء جميع الصور المحددة في الملف.

يتم الكشف عن المزيد من الميزات المتقدمة عند سرد أهداف الإنشاء في ملفات JSON أو HCL. هذه المتغيرات الداعمة والوظائف واستيفاء القيمة لتخصيص البنيات الخاصة بك.

يبحث الأمر buildx bake عن الملفات التالية بالترتيب:

  • docker-compose.yml
  • docker-compose.yaml
  • docker-bake.json
  • docker-bake.override.json
  • docker-bake.hcl
  • docker-bake.override.hcl

يمكنك تحديد ملف مختلف بعلامة الأمر -f .

بناء الأهداف

أهداف البناء تلخص كل التكوينات المتعلقة بالبناء الخاص بك. تتضمن تفاصيل مثل

  • الطريق إلى Dockerfile للبناء
  • بناء مسارات السياق ، وتحديد المحتوى المتاح داخل Dockerfile الخاص بك
  • العلامات والتسميات لإرفاقها بالصور الناتجة
  • المنصات لإنتاج الصور لـ.

تتوفر قائمة كاملة بحقول التكوين المدعومة في الوثائق. في السابق ، ربما تكون قد قدمت هذه الإعدادات كعلامات سطر أوامر إلى docker buildx build (أو حتى docker build docker عادي) ، مما يجبرك على تذكر القيم الصحيحة في كل مرة. باستخدام buildx bake يمكنك استخدام نفس القيم بشكل موثوق من خلال تحديدها في الملف المخبوز الذي يتم التحكم فيه في الإصدار.

فيما يلي مثال بسيط لأمر docker-bake.hcl الذي يحدد هدف بناء واحد:

 target "default" { dockerfile = "app/Dockerfile" contexts = { app = "app/src" shared = "shared-components/src" } tags = ["my-app:latest", "docker.io/my-org/my-app:latest"] }

سيؤدي تشغيل docker buildx bake باستخدام ملف الخبز هذا إلى تحميل app/Dockerfile Dockerfile من دليل العمل الخاص بك. سيكون لديه حق الوصول إلى app/src shared-components/src بناء. سيتم تعيين علامتين للصورة التي تم إنتاجها.

يتم إنشاء الهدف default تلقائيًا عند تشغيل docker buildx bake . يمكنك أيضًا تحديد أهداف مسماة يمكن إنشاؤها عند الطلب:

 target "app" { // ... }
 $ docker buildx bake app

استخدام أهداف متعددة

يمكنك إنشاء صورة أخرى في وقت واحد عن طريق تحديدها كهدف جديد داخل ملف الخبز الخاص بك:

 group "default" { targets = ["app", "api"] } target "app" { dockerfile = "app/Dockerfile" contexts = { app = "app/src" shared = "shared-components/src" } tags = ["my-app:latest", "docker.io/my-org/my-app:latest"] } target "api" { dockerfile = "api/Dockerfile" contexts = { src = "api/src" } tags = ["my-api:latest", "docker.io/my-org/my-api:latest"] }

يمكن إنشاء هذه الصور في وقت واحد لأنها متداخلة في مجموعة. سيتم إنشاء صور api app بالتوازي في كل مرة تقوم فيها بتشغيل أمر docker buildx bake حيث يتم تحديد المجموعة default تلقائيًا. يمكنك استخدام المجموعات المسماة بشكل مشابه لمثال الأهداف المسماة أعلاه.

بناء الميراث الهدف

يمكن أن ترث أهداف البناء من بعضها البعض لإعادة استخدام التكوين. أحد السيناريوهات التي يمكن أن يكون هذا مفيدًا فيها يتعلق بالصور التي يجب تخصيصها لبيئات مختلفة. قد ترغب في إضافة ملفات تكوين إضافية إلى متغيرات الصور المخصصة للاستخدام في التطوير. إليك docker-bake.hcl الذي يوضح هذا النموذج:

 group "default" { targets = ["backend", "backend-dev"] } target "backend" { dockerfile = "backend/Dockerfile" contexts = { src = "api/src" config = "api/config" } tags = ["backend:latest"] } target "backend-dev" { inherits = ["backend"] contexts = { config = "api/config-dev" } tags = ["backend:dev"] }

يرث هدف backend-dev جميع خصائص هدف backend ولكنه يتجاوز سياق config ويطبق علامة مختلفة.

يمكنك معاينة بنية الملف المدمج عن طريق تشغيل الأمر bake بعلامة --print :

 $ docker buildx bake --print ... "backend-dev": { "context": ".", "contexts": { "config": "api/config-dev", "src": "api/src" }, "dockerfile": "backend/Dockerfile", "tags": [ "backend:dev" ] } ...

استخدام الهدف السابق كصورة أساسية

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

 group "default" { targets = ["org-base-image", "api"] } target "org-base-image" { dockerfile = "docker-base/Dockerfile" tags = ["org-base-image:latest"] } target "api" { dockerfile = "api/Dockerfile" contexts = { base = "target:org-base-image" } tags = ["api:latest"] }

المثال الأول يبني هدف org-base-image . قد يحتوي هذا على بعض الأدوات المساعدة المشتركة لأحمال العمل المعبأة في حاويات لمؤسستك. ثم يتم إنشاء هدف api مع الإخراج من هدف org-base-image يمكن الوصول إليه باعتباره سياق البناء base . يمكن لملف API Dockerfile الآن الإشارة إلى المحتوى داخل الصورة الأساسية:

 COPY --from=base /utilities/example /usr/bin/example-utility

هذا نمط قوي يتيح لك إنشاء روابط تبعية بين الصور مع الحفاظ على ملفات Dockerfiles منفصلة.

تجاوز خصائص الأهداف في وقت البناء

يتيح لك أمر docker buildx bake تجاوز خصائص أهدافك عند تشغيل جهازك:

 $ docker buildx bake --set api.dockerfile="api/Dockerfile-dev"

يغير هذا المثال ملف api لهدف واجهة برمجة التطبيقات. * يتم دعم حرف البدل عند تحديد الهدف المراد تغييره. * يختار كل هدف من تلقاء نفسه بينما يقوم api* بتعديل جميع الأهداف التي تبدأ بـ api .

ضبط المتغيرات

يمكن لملفات HCL تحديد المتغيرات التي يمكنك الرجوع إليها في أهداف البناء الخاصة بك. استخدم كتلة variable لإعدادها:

 variable "TAG" { default = "latest" } group "default" { targets = ["app"] } target "app" { dockerfile = "src/Dockerfile" tags = ["my-app:${TAG}"] }

سيؤدي تشغيل docker buildx bake باستخدام هذا التكوين إلى وضع علامة على هدف app باعتباره my-app:latest . يمكنك تغيير قيمة متغير TAG عن طريق تعيين متغير بيئة قبل تنفيذ الأمر:

 $ TAG=v1 docker buildx bake

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

ملخص

تسمح لك إصدارات Baked Buildx بتغليف تكوين بناء الصورة على أنها "أهداف" محددة في ملف. عند تشغيل buildx bake ، يتم إنشاء الصور لجميع الأهداف المشار إليها بالتوازي.

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

يعد أمر docker buildx bake عملية عالية المستوى ليست ضرورية في كل سير عمل. لا تحتاج إلى استخدامه عند إنشاء صور بسيطة بدون تبعيات عبر المشروع. يعد استخدام docker compose build بديلاً أفضل لمعظم حالات الاستخدام التي تحافظ على تكوين الإنشاء في ملف docker-compose.yml . يجب مراعاة التبديل إلى التصميمات المخبوزة عند إنشاء العديد من الصور في وقت واحد باستخدام متغيرات وأنظمة أساسية وسياقات بناء مختلفة وتجاوزات التكوين.