كيفية استخدام Docker Buildx Bake لإنشاء خطوط أنابيب بناء صورة معقدة
نشرت: 2022-08-10 تستخدم مجموعة أوامر 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
. يجب مراعاة التبديل إلى التصميمات المخبوزة عند إنشاء العديد من الصور في وقت واحد باستخدام متغيرات وأنظمة أساسية وسياقات بناء مختلفة وتجاوزات التكوين.