Functions (original) (raw)

Home / Manuals / Docker Build / Bake / Functions

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 thego-cty standard library functions. The following example shows the add function.

docker-bake.hcl

variable "TAG" {
  default = "latest"
}

group "default" {
  targets = ["webapp"]
}

target "webapp" {
  args = {
    buildno = "${add(123, 1)}"
  }
}
$ docker buildx bake --print webapp
{
  "group": {
    "default": {
      "targets": ["webapp"]
    }
  },
  "target": {
    "webapp": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "args": {
        "buildno": "124"
      }
    }
  }
}

User-defined functions

You can createuser-defined functionsthat do just what you want, if the built-in standard library functions don't meet your needs.

The following example defines an increment function.

docker-bake.hcl

function "increment" {
  params = [number]
  result = number + 1
}

group "default" {
  targets = ["webapp"]
}

target "webapp" {
  args = {
    buildno = "${increment(123)}"
  }
}
$ docker buildx bake --print webapp
{
  "group": {
    "default": {
      "targets": ["webapp"]
    }
  },
  "target": {
    "webapp": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "args": {
        "buildno": "124"
      }
    }
  }
}

Variables in functions

You can make references tovariables 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.

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.

$ docker buildx bake --print webapp
{
  "group": {
    "default": {
      "targets": ["webapp"]
    }
  },
  "target": {
    "webapp": {
      "context": ".",
      "dockerfile": "Dockerfile",
      "tags": ["user/repo:v1"]
    }
  }
}