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