告别复杂的 Docker 构建命令——用这个简单的小技巧!

我从来没有这样做过。每次我需要构建镜像时,我都得去谷歌搜索正确的标志。对于单一仓库多平台构建来说,情况会变得更糟,管理多个命令变得非常令人头疼。

但是,如果您可以将整个构建过程定义为代码并使用****一个命令运行所有内容,那会怎样?

好吧,你很幸运!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 builddocker push命令不同,它提供了声明式方法、并行执行和更好的缓存,使其成为复杂项目的理想选择。加粗样式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值