我从来没有这样做过。每次我需要构建镜像时,我都得去谷歌搜索正确的标志。对于单一仓库和多平台构建来说,情况会变得更糟,管理多个命令变得非常令人头疼。
但是,如果您可以将整个构建过程定义为代码并使用****一个命令运行所有内容,那会怎样?
好吧,你很幸运!Docker Bake现已在Docker Desktop 4.38中提供,它通过声明式方法、并行执行和缓存简化了复杂的构建,使构建更快、更容易。
让我们开始吧!🚀
多服务项目的文件夹结构
下面介绍如何组织一个包含多个服务的项目来构建 docker 镜像。
myproject/
│-- docker-bake.hcl
│-- frontend/
│ ├── Dockerfile.frontend
│ ├── app/
│-- backend/
│ ├── Dockerfile.backend
│ ├── api/
通过此结构,您可以定义单个烘焙文件来一次构建所有服务。
示例 1:定义烘焙文件
创造docker-bake.hcl
:
group "default" {
targets = ["backend"]
}
target "backend" {
context = "./"
dockerfile = "Dockerfile"
tags = ["deepak1305/backend:latest"]
platforms = ["linux/amd64", "linux/arm64"]
push = true
}
运行烘焙命令:
docker buildx 烘焙
这将构建并推动deepak1305/backend:latest
两者的amd64
架构arm64
。
示例 2:具有不同存储库的多个构建目标
group "default" {
targets = ["frontend", "backend"]
}
target "frontend" {
context = "./frontend"
dockerfile = "Dockerfile.frontend"
tags = ["deepak1305/frontend:latest"]
push = true
}
target "backend" {
context = "./backend"
dockerfile = "Dockerfile.backend"
tags = ["deepak1305/backend:latest"]
push = true
}
这将使用单独的 Dockerfiles 和不同的存储库为前端和后端服务构建和推送图像。
示例 3:使用变量
变量允许动态标签分配:
defaults {
args = {
VERSION = "1.0.0"
}
}
target "backend" {
context = "./"
dockerfile = "Dockerfile"
tags = ["deepak1305/backend:${args.VERSION}"]
push = true
}
示例 4:继承目标以供重用
您可以定义一个基本目标并从中继承属性:
target "base" {
platforms = ["linux/amd64", "linux/arm64"]
push = true
}
target "frontend" {
inherits = ["base"]
context = "./frontend"
dockerfile = "Dockerfile.frontend"
tags = ["deepak1305/frontend:latest"]
}
target "backend" {
inherits = ["base"]
context = "./backend"
dockerfile = "Dockerfile.backend"
tags = ["deepak1305/backend:latest"]
}
这样就可以通过继承通用配置来避免重复,并确保推送所有图像。
示例 5:覆盖继承中的值
您可以在保留共享设置的同时覆盖子目标中的继承值:
target "base" {
platforms = ["linux/amd64", "linux/arm64"]
push = true
args = {
BUILD_ENV = "production"
}
}
target "frontend" {
inherits = ["base"]
context = "./frontend"
dockerfile = "Dockerfile.frontend"
tags = ["deepak1305/frontend:latest"]
}
target "backend" {
inherits = ["base"]
context = "./backend"
dockerfile = "Dockerfile.backend"
tags = ["deepak1305/backend:v2"]
args = {
BUILD_ENV = "staging" # Overriding inherited argument
}
}
这里,backend
仍然继承了的平台和推送设置base
,但覆盖了它的标签和构建环境。
示例 6:对多个目标进行分组以进行批量构建
当您有多个服务(例如,前端、后端、数据库)时,您可以定义组来一起构建它们。
group "all-services" {
targets = ["frontend", "backend", "database"]
}
group "app-services" {
targets = ["frontend", "backend"]
}
target "frontend" {
context = "./frontend"
dockerfile = "Dockerfile.frontend"
tags = ["deepak1305/frontend:latest"]
push = true
}
target "backend" {
context = "./backend"
dockerfile = "Dockerfile.backend"
tags = ["deepak1305/backend:latest"]
push = true
}
target "database" {
context = "./database"
dockerfile = "Dockerfile.database"
tags = ["deepak1305/database:latest"]
push = true
}
如何使用它?
- 一次性构建所有服务
docker buildx 烘焙所有服务
这将构建并推送前端、后端和数据库图像。
- 仅构建与应用程序相关的服务
docker buildx 烘焙应用服务
这将构建并推送前端和后端图像,跳过数据库。
结论
Docker Bake 提供了一种高效、结构化的方式来处理多平台、并行和缓存优化的构建。与手动docker build
和docker push
命令不同,它提供了声明式方法、并行执行和更好的缓存,使其成为复杂项目的理想选择。加粗样式