使用 Bake 配置构建

Bake 支持从文件加载构建定义,但有时您需要更大的灵活性来配置这些定义。

对于此用例,您可以在烘焙文件中定义变量,这些变量可以由用户使用环境变量或 其他烘焙文件中的属性定义来设置。如果您希望更改单次调用的特定值,您可以使用命令行中的--set标志 。

全局范围属性

您可以在 HCL/JSON 中定义全局范围属性,并将它们用于代码重用和设置变量值。这意味着您可以使用要设置/覆盖的值创建“仅数据”HCL 文件,并在常规输出文件列表中使用它。

# docker-bake.hcl
variable "FOO" {
  default = "abc"
}

target "app" {
  args = {
    v1 = "pre-${FOO}"
  }
}

您可以直接使用该文件:

$ docker buildx bake --print app
{
  "group": {
    "default": {
      "targets": ["app"]
    }
  },
  "target": {
    "app": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "args": {
        "v1": "pre-abc"
      }
    }
  }
}

或者创建一个覆盖配置文件:

# env.hcl
WHOAMI="myuser"
FOO="def-${WHOAMI}"

并与这两个文件一起调用烘焙:

$ docker buildx bake -f docker-bake.hcl -f env.hcl --print app
{
  "group": {
    "default": {
      "targets": ["app"]
    }
  },
  "target": {
    "app": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "args": {
        "v1": "pre-def-myuser"
      }
    }
  }
}

资源插值

您还可以引用定义为其他目标一部分的属性,以帮助减少目标之间的重复。

# docker-bake.hcl
target "foo" {
  dockerfile = "${target.foo.name}.Dockerfile"
  tags       = [target.foo.name]
}
target "bar" {
  dockerfile = "${target.foo.name}.Dockerfile"
  tags       = [target.bar.name]
}

您可以直接使用该文件:

$ docker buildx bake --print foo bar
{
  "group": {
    "default": {
      "targets": ["foo", "bar"]
    }
  },
  "target": {
    "foo": {
      "context": ".",
      "dockerfile": "foo.Dockerfile",
      "tags": ["foo"]
    },
    "bar": {
      "context": ".",
      "dockerfile": "foo.Dockerfile",
      "tags": ["bar"]
    }
  }
}

从命令行

--set您还可以使用以下标志从命令行覆盖目标配置 :

# docker-bake.hcl
target "app" {
  args = {
    mybuildarg = "foo"
  }
}
$ docker buildx bake --set app.args.mybuildarg=bar --set app.platform=linux/arm64 app --print
{
  "group": {
    "default": {
      "targets": ["app"]
    }
  },
  "target": {
    "app": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "args": {
        "mybuildarg": "bar"
      },
      "platforms": ["linux/arm64"]
    }
  }
}

还支持https://golang.org/pkg/path/#Match中定义的模式匹配语法 :

$ 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"

可覆盖字段的完整列表:

  • args
  • cache-from
  • cache-to
  • context
  • dockerfile
  • labels
  • no-cache
  • output
  • platform
  • pull
  • secrets
  • ssh
  • tags
  • target

跨文件使用变量中的变量

当指定多个文件时,一个文件可以使用另一文件中定义的变量。

# docker-bake1.hcl
variable "FOO" {
  default = upper("${BASE}def")
}

variable "BAR" {
  default = "-${FOO}-"
}

target "app" {
  args = {
    v1 = "pre-${BAR}"
  }
}
# docker-bake2.hcl
variable "BASE" {
  default = "abc"
}

target "app" {
  args = {
    v2 = "${FOO}-post"
  }
}
$ docker buildx bake -f docker-bake1.hcl -f docker-bake2.hcl --print app
{
  "group": {
    "default": {
      "targets": ["app"]
    }
  },
  "target": {
    "app": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "args": {
        "v1": "pre--ABCDEF-",
        "v2": "ABCDEF-post"
      }
    }
  }
}