วิธีใช้ 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 docker build แบบธรรมดา) บังคับให้คุณจำค่าที่ถูกต้องในแต่ละครั้ง ด้วย 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 ด้วยไฟล์ 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 org-base-image ที่สามารถเข้าถึงได้เป็นบริบทของบิลด์ API Dockerfile สามารถอ้างอิงเนื้อหาภายในอิมเมจพื้นฐานได้แล้ว:

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

นี่เป็นรูปแบบที่มีประสิทธิภาพที่ช่วยให้คุณสร้างลิงก์การขึ้นต่อกันระหว่างรูปภาพในขณะที่ยังคงรักษา Dockerfiles ไว้ต่างหาก

การเอาชนะคุณสมบัติเป้าหมาย ณ เวลาสร้าง

คำสั่ง docker buildx bake ให้คุณแทนที่คุณสมบัติของเป้าหมายเมื่อคุณรันบิลด์ของคุณ:

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

ตัวอย่างนี้เปลี่ยน Dockerfile ของเป้าหมาย 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 เป็นทางเลือกที่ดีกว่าสำหรับกรณีการใช้งานส่วนใหญ่ที่เก็บการกำหนดค่า build ในไฟล์ docker-compose.yml ของคุณ การเปลี่ยนไปใช้บิลด์แบบอบควรพิจารณาเมื่อคุณสร้างอิมเมจจำนวนมากพร้อมกันโดยใช้ตัวแปร แพลตฟอร์ม บริบทของบิวด์ และการแทนที่การกำหนดค่าที่แตกต่างกัน