HCL functions are great for when you need to manipulate values in your build configuration in more complex ways than just concatenation or interpolation.
Standard library#
Bake ships with built-in support for the go-cty
standard library functions.
The following example shows the add
function.
```hcl {title=docker-bake.hcl} variable "TAG" { default = "latest" }
group "default" { targets = ["webapp"] }
target "webapp" { args = { buildno = "${add(123, 1)}" } }
```console
$ docker buildx bake --print webapp
{
"group": {
"default": {
"targets": ["webapp"]
}
},
"target": {
"webapp": {
"context": ".",
"dockerfile": "Dockerfile",
"args": {
"buildno": "124"
}
}
}
}
User-defined functions#
You can create user-defined functions that do just what you want, if the built-in standard library functions don't meet your needs.
The following example defines an increment
function.
```hcl {title=docker-bake.hcl} function "increment" { params = [number] result = number + 1 }
group "default" { targets = ["webapp"] }
target "webapp" { args = { buildno = "${increment(123)}" } }
```console
$ docker buildx bake --print webapp
{
"group": {
"default": {
"targets": ["webapp"]
}
},
"target": {
"webapp": {
"context": ".",
"dockerfile": "Dockerfile",
"args": {
"buildno": "124"
}
}
}
}
Variables in functions#
You can make references to variables and standard library functions inside your functions.
You can't reference user-defined functions from other functions.
The following example uses a global variable (REPO
) in a custom function.
```hcl {title=docker-bake.hcl}
docker-bake.hcl#
variable "REPO" { default = "user/repo" }
function "tag" { params = [tag] result = ["${REPO}:${tag}"] }
target "webapp" { tags = tag("v1") }
Printing the Bake file with the `--print` flag shows that the `tag` function
uses the value of `REPO` to set the prefix of the tag.
```console
$ docker buildx bake --print webapp
{
"group": {
"default": {
"targets": ["webapp"]
}
},
"target": {
"webapp": {
"context": ".",
"dockerfile": "Dockerfile",
"tags": ["user/repo:v1"]
}
}
}