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 the
go-cty
standard library functions.
The following example shows the add
function.
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 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.
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 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.
# 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"]
}
}
}