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