Bake 中的继承

目标可以使用 attribute(属性)从其他目标继承属性。例如,假设您有一个构建 Docker 的目标 image 的 API APIinherits

target "app-dev" {
  args = {
    GO_VERSION = "1.23"
  }
  tags = ["docker.io/username/myapp:dev"]
  labels = {
    "org.opencontainers.image.source" = "https://github.com/username/myapp"
    "org.opencontainers.image.author" = "moby.whale@example.com"
  }
}

您可以创建使用相同的构建配置的新目标,但使用 生产版本的属性略有不同。在此示例中,目标继承了目标,但覆盖了该属性并添加了一个新属性:app-releaseapp-devtagsplatforms

target "app-release" {
  inherits = ["app-dev"]
  tags = ["docker.io/username/myapp:latest"]
  platforms = ["linux/amd64", "linux/arm64"]
}

常见的可重用目标

一种常见的继承模式是定义一个通用目标,其中包含 项目中所有或多个构建目标的 shared 属性。为 示例,以下目标定义了一组通用的 build 参数:_common

target "_common" {
  args = {
    GO_VERSION = "1.23"
    BUILDKIT_CONTEXT_KEEP_GIT_DIR = 1
  }
}

然后,您可以在其他目标中继承目标,以应用共享的 属性:_common

target "lint" {
  inherits = ["_common"]
  dockerfile = "./dockerfiles/lint.Dockerfile"
  output = ["type=cacheonly"]
}

target "docs" {
  inherits = ["_common"]
  dockerfile = "./dockerfiles/docs.Dockerfile"
  output = ["./docs/reference"]
}

target "test" {
  inherits = ["_common"]
  target = "test-output"
  output = ["./test"]
}

target "binaries" {
  inherits = ["_common"]
  target = "binaries"
  output = ["./build"]
  platforms = ["local"]
}

覆盖继承的属性

当一个目标继承另一个目标时,它可以覆盖任何继承的 属性。例如,以下 target 将覆盖 从继承的目标:args

target "app-dev" {
  inherits = ["_common"]
  args = {
    GO_VERSION = "1.17"
  }
  tags = ["docker.io/username/myapp:dev"]
}

参数 in 设置为 ,覆盖目标中的参数。GO_VERSIONapp-release1.17GO_VERSIONapp-dev

有关覆盖属性的更多信息,请参阅覆盖 配置页面。

从多个目标继承

该属性是一个列表,这意味着您可以重用 多个其他目标。在以下示例中,app-release 目标重用 属性。inheritsapp-dev_common

target "_common" {
  args = {
    GO_VERSION = "1.23"
    BUILDKIT_CONTEXT_KEEP_GIT_DIR = 1
  }
}

target "app-dev" {
  inherits = ["_common"]
  args = {
    BUILDKIT_CONTEXT_KEEP_GIT_DIR = 0
  }
  tags = ["docker.io/username/myapp:dev"]
  labels = {
    "org.opencontainers.image.source" = "https://github.com/username/myapp"
    "org.opencontainers.image.author" = "moby.whale@example.com"
  }
}

target "app-release" {
  inherits = ["app-dev", "_common"]
  tags = ["docker.io/username/myapp:latest"]
  platforms = ["linux/amd64", "linux/arm64"]
}

当从多个目标继承属性时,如果存在冲突, 在 inherits (继承) 列表中最后显示的目标优先。上一个 example 定义 target 中的 在目标中覆盖它。BUILDKIT_CONTEXT_KEEP_GIT_DIR_commonapp-dev

目标同时继承目标和目标。 该参数在目标中设置为 0 和 1 在目标中。中的 argument 目标设置为 1,而不是 0,因为将显示目标 inherits 列表中的 last 中。app-releaseapp-dev_commonBUILDKIT_CONTEXT_KEEP_GIT_DIRapp-dev_commonBUILDKIT_CONTEXT_KEEP_GIT_DIRapp-release_common

重用目标中的单个属性

如果您只想从 target 继承单个属性,则可以引用 使用点表示法的另一个目标的属性。例如,在 following Bake 文件,则目标会重用 target 中的属性:bartagsfoo

docker-bake.hcl
target "foo" {
  dockerfile = "foo.Dockerfile"
  tags       = ["myapp:latest"]
}
target "bar" {
  dockerfile = "bar.Dockerfile"
  tags       = target.foo.tags
}