docker buildx bake

描述从文件构建
用法docker buildx bake [OPTIONS] [TARGET...]
别名
docker buildx f

描述

Bake 是一个高级构建命令。每个指定的目标都会作为构建的一部分并行运行。

阅读 使用 Bake 的高级构建选项 指南,了解如何编写 Bake 文件。

注意

未来如果需要,buildx bake 命令可能会包含向后不兼容的特性。我们正在征集关于改进该命令和进一步扩展其功能的反馈意见。

选项

选项默认值描述
--allow允许构建访问指定资源
--callbuild设置评估构建的方法(check, outline, targets
--check--call=check 的简写
-f, --file构建定义文件
--list列出目标或变量
--load--set=*.output=type=docker 的简写
--metadata-file将构建结果元数据写入文件
--no-cache构建镜像时不使用缓存
--print打印选项而不执行构建
--progressauto设置进度输出的类型(auto, quiet, plain, tty, rawjson)。使用 plain 显示容器输出
--provenance--set=*.attest=type=provenance 的简写
--pull始终尝试拉取所有引用的镜像
--push--set=*.output=type=registry 的简写
--sbom--set=*.attest=type=sbom 的简写
--set覆盖目标值(例如,targetpattern.key=value

示例

允许额外的特权授权(--allow)

--allow=ENTITLEMENT[=VALUE]

授权旨在提供对特权操作的受控访问。默认情况下,Buildx 和 BuildKit 在受限权限下运行,以保护用户及其系统免受意外副作用或安全风险的影响。--allow 标志明确授予对额外授权的访问权限,从而清楚表明构建或 Bake 操作何时需要提升的权限。

除了 BuildKit 的 network.hostsecurity.insecure 授权(参见 docker buildx build --allow)之外,Bake 还支持文件系统授权,可以精细地控制文件系统访问。这对于需要访问默认工作目录之外文件的构建特别有用。

Bake 支持以下文件系统授权

  • --allow fs=<path|*> - 授予对工作目录之外文件的读写访问权限。
  • --allow fs.read=<path|*> - 授予对工作目录之外文件的读访问权限。
  • --allow fs.write=<path|*> - 授予对工作目录之外文件的写访问权限。

fs 授权接受文件系统上目录的路径值(相对或绝对)。另外,您可以传递通配符(*),以允许 Bake 访问整个文件系统。

示例:fs.read

给定以下 Bake 配置,Bake 将需要访问相对于 Bake 文件的父目录。

target "app" {
  context = "../src"
}

假设 docker buildx bake appdocker-bake.hcl 文件在同一目录中执行,您需要明确允许 Bake 从 ../src 目录读取。在这种情况下,以下所有调用都有效

$ docker buildx bake --allow fs.read=* app
$ docker buildx bake --allow fs.read=../src app
$ docker buildx bake --allow fs=* app

示例:fs.write

以下 docker-bake.hcl 文件需要对 /tmp 目录的写访问权限。

target "app" {
  output = "/tmp"
}

假设 docker buildx bake app/tmp 目录之外执行,您需要通过指定路径或使用通配符来允许 fs.write 授权

$ docker buildx bake --allow fs=/tmp app
$ docker buildx bake --allow fs.write=/tmp app
$ docker buildx bake --allow fs.write=* app

覆盖已配置的构建器实例(--builder)

buildx --builder 相同。

调用前端方法(--call)

build --call 相同。

调用:check(--check)

build --check 相同。

指定构建定义文件(-f, --file)

使用 -f / --file 选项来指定要使用的构建定义文件。文件可以是 HCL、JSON 或 Compose 文件。如果指定了多个文件,将读取所有文件并合并构建配置。

您可以传递要构建的目标名称,以仅构建特定的目标。以下示例构建了在 docker-bake.dev.hcl 文件中定义的 dbwebapp-release 目标

# docker-bake.dev.hcl
group "default" {
  targets = ["db", "webapp-dev"]
}

target "webapp-dev" {
  dockerfile = "Dockerfile.webapp"
  tags = ["docker.io/username/webapp"]
}

target "webapp-release" {
  inherits = ["webapp-dev"]
  platforms = ["linux/amd64", "linux/arm64"]
}

target "db" {
  dockerfile = "Dockerfile.db"
  tags = ["docker.io/username/db"]
}
$ docker buildx bake -f docker-bake.dev.hcl db webapp-release

有关更多详细信息,请参阅 Bake 文件参考

列出目标和变量(--list)

--list 标志显示 Bake 配置中所有可用的目标或变量,以及描述(如果在 Bake 文件中使用 description 属性设置)。

列出所有目标

列出目标
$ docker buildx bake --list=targets
TARGET              DESCRIPTION
binaries
default             binaries
update-docs
validate
validate-golangci   Validate .golangci.yml schema (does not run Go linter)

列出变量

$ docker buildx bake --list=variables
VARIABLE      VALUE                DESCRIPTION
REGISTRY      docker.io/username   Registry and namespace
IMAGE_NAME    my-app               Image name
GO_VERSION    <null>

默认情况下,docker buildx bake --list 的输出以表格格式呈现。另外,您可以使用长格式 CSV 语法并指定 format 属性以 JSON 格式输出列表。

$ docker buildx bake --list=type=targets,format=json

将构建结果元数据写入文件(--metadata-file)

类似于 buildx build --metadata-file,但会为每个目标写入结果映射,例如

# docker-bake.hcl
group "default" {
  targets = ["db", "webapp-dev"]
}

target "db" {
  dockerfile = "Dockerfile.db"
  tags = ["docker.io/username/db"]
}

target "webapp-dev" {
  dockerfile = "Dockerfile.webapp"
  tags = ["docker.io/username/webapp"]
}
$ docker buildx bake --load --metadata-file metadata.json .
$ cat metadata.json
{
  "buildx.build.warnings": {},
  "db": {
    "buildx.build.provenance": {},
    "buildx.build.ref": "mybuilder/mybuilder0/0fjb6ubs52xx3vygf6fgdl611",
    "containerimage.config.digest": "sha256:2937f66a9722f7f4a2df583de2f8cb97fc9196059a410e7f00072fc918930e66",
    "containerimage.descriptor": {
      "annotations": {
        "config.digest": "sha256:2937f66a9722f7f4a2df583de2f8cb97fc9196059a410e7f00072fc918930e66",
        "org.opencontainers.image.created": "2022-02-08T21:28:03Z"
      },
      "digest": "sha256:19ffeab6f8bc9293ac2c3fdf94ebe28396254c993aea0b5a542cfb02e0883fa3",
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "size": 506
    },
    "containerimage.digest": "sha256:19ffeab6f8bc9293ac2c3fdf94ebe28396254c993aea0b5a542cfb02e0883fa3"
  },
  "webapp-dev": {
    "buildx.build.provenance": {},
    "buildx.build.ref": "mybuilder/mybuilder0/kamngmcgyzebqxwu98b4lfv3n",
    "containerimage.config.digest": "sha256:9651cc2b3c508f697c9c43b67b64c8359c2865c019e680aac1c11f4b875b67e0",
    "containerimage.descriptor": {
      "annotations": {
        "config.digest": "sha256:9651cc2b3c508f697c9c43b67b64c8359c2865c019e680aac1c11f4b875b67e0",
        "org.opencontainers.image.created": "2022-02-08T21:28:15Z"
      },
      "digest": "sha256:6d9ac9237a84afe1516540f40a0fafdc86859b2141954b4d643af7066d598b74",
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "size": 506
    },
    "containerimage.digest": "sha256:6d9ac9237a84afe1516540f40a0fafdc86859b2141954b4d643af7066d598b74"
  }
}

注意

构建记录 provenance (buildx.build.provenance) 默认包含最小的 provenance。设置 BUILDX_METADATA_PROVENANCE 环境变量来自定义此行为

  • min 设置最小 provenance(默认值)。
  • max 设置完整 provenance。
  • disabled, false0 不设置任何 provenance。

注意

构建警告(buildx.build.warnings)默认不包括在内。将 BUILDX_METADATA_WARNINGS 环境变量设置为 1true 以包含它们。

构建镜像时不使用缓存(--no-cache)

build --no-cache 相同。构建镜像时不使用缓存。

打印选项而不执行构建(--print)

以 JSON 格式打印所需构建目标的最终选项,但不开始构建。

$ docker buildx bake -f docker-bake.hcl --print db
{
  "group": {
    "default": {
      "targets": [
        "db"
      ]
    }
  },
  "target": {
    "db": {
      "context": "./",
      "dockerfile": "Dockerfile",
      "tags": [
        "docker.io/tiborvass/db"
      ]
    }
  }
}

设置进度输出类型(--progress)

build --progress 相同。

创建 provenance 证明(--provenance)

build --provenance 相同。

始终尝试拉取更新版本的镜像(--pull)

build --pull 相同。

创建 SBOM 证明(--sbom)

build --sbom 相同。

从命令行覆盖目标配置(--set)

--set targetpattern.key[.subkey]=value

从命令行覆盖目标配置。模式匹配语法定义在 https://golang.ac.cn/pkg/path/#Match

$ docker buildx bake --set target.args.mybuildarg=value
$ docker buildx bake --set target.platform=linux/arm64
$ docker buildx bake --set foo*.args.mybuildarg=value   # overrides build arg for all targets starting with 'foo'
$ docker buildx bake --set *.platform=linux/arm64       # overrides platform for all targets
$ docker buildx bake --set foo*.no-cache                # bypass caching only for targets starting with 'foo'
$ docker buildx bake --set target.platform+=linux/arm64 # appends 'linux/arm64' to the platform list

您可以覆盖以下字段

  • annotations
  • attest
  • args
  • cache-from
  • cache-to
  • context
  • dockerfile
  • entitlements
  • labels
  • load
  • no-cache
  • no-cache-filter
  • output
  • platform
  • pull
  • push
  • secrets
  • ssh
  • tags
  • target

您可以使用 += 运算符附加以下字段

  • annotations¹
  • attest¹
  • cache-from
  • cache-to
  • entitlements¹
  • no-cache-filter
  • output
  • platform
  • secrets
  • ssh
  • tags

注意

¹ 这些字段默认已经会附加。