Các docker buildx
nhóm lệnh sử dụng BuildKit để hiển thị các khả năng xây dựng hình ảnh nâng cao. Bản dựng nướng là một tính năng cấp cao có thể được sử dụng để xác định đường ống xây dựng tự động. Chúng cho phép bạn tạo ra nhiều hình ảnh từ một thao tác xây dựng duy nhất.
Quy trình công việc ẩn rất hữu ích khi bạn muốn xuất bản các biến thể khác nhau của hình ảnh hoặc xây dựng song song một số dự án được liên kết. Trong bài viết này, chúng tôi sẽ đề cập đến các tính năng chính của docker buildx bake
và cách bạn có thể sử dụng chúng để hợp lý hóa các bản dựng phức tạp.
Bắt đầu
Các docker buildx bake
lệnh thực thi nhiều “mục tiêu” xây dựng mà mỗi “mục tiêu” tạo ra một hình ảnh vùng chứa. Các mục tiêu chạy song song nếu có thể để tối đa hóa hiệu suất. Các mục tiêu cũng có thể tham chiếu trực tiếp đến những người đi trước để tạo các đường ống tuần tự.
Mục tiêu xây dựng có thể được xác định bằng cách sử dụng một số cơ chế khác nhau bao gồm các tệp Docker Compose hiện có. Buildx sẽ tự động xây dựng tất cả các hình ảnh được xác định trong tệp.
Các tính năng nâng cao hơn được hiển thị khi bạn liệt kê các mục tiêu xây dựng trong tệp JSON hoặc HCL. Các biến hỗ trợ, hàm và nội suy giá trị này để tùy chỉnh các bản dựng của bạn.
Các buildx bake
lệnh tìm kiếm các tệp sau theo thứ tự:
docker-compose.yml
docker-compose.yaml
docker-bake.json
docker-bake.override.json
docker-bake.hcl
docker-bake.override.hcl
Bạn có thể chỉ định một tệp khác với -f
cờ lệnh.
Xây dựng mục tiêu
Xây dựng mục tiêu đóng gói tất cả các cấu hình liên quan đến bản dựng của bạn. Chúng bao gồm các chi tiết như
- đường dẫn đến Dockerfile để xây dựng
-
xây dựng các đường dẫn ngữ cảnh, xác định nội dung có sẵn trong Dockerfile của bạn
- thẻ và nhãn để đính kèm vào hình ảnh đầu ra
- các nền tảng để sản xuất hình ảnh cho.
Danh sách đầy đủ các trường cấu hình được hỗ trợ có sẵn trong tài liệu. Trước đây, bạn có thể đã cung cấp các cài đặt này dưới dạng cờ dòng lệnh cho docker buildx build
(hoặc thậm chí đơn giản docker build
), buộc bạn phải nhớ các giá trị chính xác mỗi lần. Với buildx bake
bạn có thể sử dụng các giá trị tương tự một cách đáng tin cậy bằng cách xác định chúng trong tệp nướng do phiên bản kiểm soát của bạn.
Đây là một ví dụ đơn giản về docker-bake.hcl
lệnh xác định một mục tiêu xây dựng duy nhất:
target "default" {
dockerfile = "app/Dockerfile"
contexts = {
app = "app/src"
shared = "shared-components/src"
}
tags = ["my-app:latest", "docker.io/my-org/my-app:latest"]
}
Đang chạy docker buildx bake
với tệp nướng này sẽ tải app/Dockerfile
Dockerfile từ thư mục làm việc của bạn. Nó sẽ có quyền truy cập vào app/src
và shared-components/src
thư mục làm bối cảnh xây dựng. Hình ảnh được tạo ra sẽ được gán hai thẻ.
Các default
mục tiêu được tạo tự động khi bạn chạy docker buildx bake
. Bạn cũng có thể xác định các mục tiêu được đặt tên có thể được tạo theo yêu cầu:
target "app" {
// ...
}
$ docker buildx bake app
Sử dụng Nhiều Mục tiêu
Bạn có thể xây dựng một hình ảnh khác đồng thời bằng cách xác định nó làm mục tiêu mới bên trong tệp baking của bạn:
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 = "https://www.howtogeek.com/devops/how-to-use-docker-buildx-bake-to-create-complex-image-build-pipelines/api/src"
}
tags = ["my-api:latest", "docker.io/my-org/my-api:latest"]
}
Những hình ảnh này có thể được tạo đồng thời vì chúng được lồng vào một nhóm. Các api
và app
hình ảnh sẽ được tạo song song mỗi khi bạn chạy docker buildx bake
lệnh như default
nhóm được chọn tự động. Bạn có thể sử dụng các nhóm được đặt tên tương tự như ví dụ về mục tiêu được đặt tên ở trên.
Xây dựng kế thừa mục tiêu
Các mục tiêu xây dựng có thể kế thừa lẫn nhau để sử dụng lại cấu hình. Một tình huống mà điều này có thể hữu ích liên quan đến hình ảnh cần được tùy chỉnh cho các môi trường khác nhau. Bạn có thể muốn thêm các tệp cấu hình bổ sung vào các biến thể hình ảnh nhằm mục đích sử dụng cho việc phát triển. Đây là một docker-bake.hcl
điều đó thể hiện mô hình này:
group "default" {
targets = ["backend", "backend-dev"]
}
target "backend" {
dockerfile = "backend/Dockerfile"
contexts = {
src = "https://www.howtogeek.com/devops/how-to-use-docker-buildx-bake-to-create-complex-image-build-pipelines/api/src"
config = "api/config"
}
tags = ["backend:latest"]
}
target "backend-dev" {
inherits = ["backend"]
contexts = {
config = "api/config-dev"
}
tags = ["backend:dev"]
}
Các backend-dev
target kế thừa tất cả các thuộc tính của backend
nhắm mục tiêu nhưng ghi đè config
ngữ cảnh và áp dụng một thẻ khác.
Bạn có thể xem trước cấu trúc tệp đã hợp nhất bằng cách chạy bake
lệnh với --print
lá cờ:
$ docker buildx bake --print
...
"backend-dev": {
"context": ".",
"contexts": {
"config": "api/config-dev",
"src": "https://www.howtogeek.com/devops/how-to-use-docker-buildx-bake-to-create-complex-image-build-pipelines/api/src"
},
"dockerfile": "backend/Dockerfile",
"tags": [
"backend:dev"
]
}
...
Sử dụng Mục tiêu Trước đó làm Hình ảnh Cơ sở
Đôi khi bạn có thể muốn mục tiêu xây dựng sử dụng hình ảnh được tạo bởi mục tiêu trước đó làm cơ sở của chính nó. Đây là một giải pháp thay thế cho các bản dựng nhiều giai đoạn có thể được sử dụng khi các tệp Dockerfiles của bạn phụ thuộc vào nhau nhưng không thể hợp nhất với nhau, có lẽ vì chúng tồn tại trong các dự án khác nhau.
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"]
}
Ví dụ đầu tiên xây dựng org-base-image
Mục tiêu. Điều này có thể chứa một số tiện ích phổ biến cho khối lượng công việc được chứa trong tổ chức của bạn. Các api
mục tiêu sau đó được xây dựng với đầu ra từ org-base-image
mục tiêu có thể truy cập như base
xây dựng-bối cảnh. API Dockerfile hiện có thể tham chiếu nội dung bên trong hình ảnh cơ sở:
COPY --from=base /utilities/example /usr/bin/example-utility
Đây là một mẫu mạnh mẽ cho phép bạn tạo liên kết phụ thuộc giữa các hình ảnh trong khi duy trì các tệp Dockerfiles riêng biệt.
Ghi đè các thuộc tính của mục tiêu tại thời điểm xây dựng
Các docker buildx bake
lệnh cho phép bạn ghi đè các thuộc tính của mục tiêu khi bạn chạy bản dựng của mình:
$ docker buildx bake --set api.dockerfile="api/Dockerfile-dev"
Ví dụ này thay đổi Dockerfile của api
Mục tiêu. Các *
ký tự đại diện được hỗ trợ khi xác định mục tiêu để thay đổi. *
tự nó chọn mọi mục tiêu trong khi api*
sẽ sửa đổi tất cả các mục tiêu bắt đầu bằng api
.
Đặt biến
Tệp HCL có thể xác định các biến mà bạn có thể tham chiếu trong mục tiêu xây dựng của mình. sử dụng một variable
khối để thiết lập chúng:
variable "TAG" {
default = "latest"
}
group "default" {
targets = ["app"]
}
target "app" {
dockerfile = "src/Dockerfile"
tags = ["my-app:${TAG}"]
}
Đang chạy docker buildx bake
với cấu hình này sẽ gắn thẻ app
nhắm mục tiêu như my-app:latest
. Bạn có thể thay đổi giá trị của TAG
bằng cách đặt một biến môi trường trước khi bạn thực hiện lệnh:
$ TAG=v1 docker buildx bake
Bạn có thể sử dụng tất cả các khả năng nội suy và so sánh có thể thay đổi của ngôn ngữ HCL để làm cho các mục tiêu xây dựng của bạn có thể tái sử dụng. Các chức năng cũng có sẵn để phân tích cú pháp và chuyển đổi các giá trị của bạn.
Bản tóm tắt
Các bản dựng Buildx ẩn cho phép bạn đóng gói cấu hình xây dựng hình ảnh dưới dạng “mục tiêu” được xác định trong một tệp. Khi bạn chạy buildx bake
hình ảnh cho tất cả các mục tiêu tham chiếu được xây dựng song song.
Các mục tiêu có thể kế thừa và phụ thuộc vào nhau. Bạn cũng có thể sử dụng các biến và hàm để tạo các đường ống xây dựng có cấu hình và phức tạp cao.
Các docker buildx bake
lệnh là một hoạt động cấp cao không cần thiết trong mọi quy trình làm việc. Bạn không cần phải sử dụng nó khi bạn đang tạo những hình ảnh đơn giản không có phụ thuộc nhiều dự án. Sử dụng docker compose build
là một giải pháp thay thế tốt hơn cho hầu hết các trường hợp sử dụng giữ cấu hình xây dựng trong docker-compose.yml
tập tin. Việc chuyển sang các bản dựng nướng nên được xem xét khi bạn đang xây dựng nhiều hình ảnh đồng thời bằng cách sử dụng các biến, nền tảng, bối cảnh xây dựng và ghi đè cấu hình khác nhau.