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"]
    }
  }
}