|
|
|
# Configuring builds
|
|
|
|
|
|
|
|
Bake supports loading build definition from files, but sometimes you need even
|
|
|
|
more flexibility to configure this definition.
|
|
|
|
|
|
|
|
For this use case, you can define variables inside the bake files that can be
|
|
|
|
set by the user with environment variables or by [attribute definitions](#global-scope-attributes)
|
|
|
|
in other bake files. If you wish to change a specific value for a single
|
|
|
|
invocation you can use the `--set` flag [from the command line](#from-command-line).
|
|
|
|
|
|
|
|
## Global scope attributes
|
|
|
|
|
|
|
|
You can define global scope attributes in HCL/JSON and use them for code reuse
|
|
|
|
and setting values for variables. This means you can do a "data-only" HCL file
|
|
|
|
with the values you want to set/override and use it in the list of regular
|
|
|
|
output files.
|
|
|
|
|
|
|
|
```hcl
|
|
|
|
# docker-bake.hcl
|
|
|
|
variable "FOO" {
|
|
|
|
default = "abc"
|
|
|
|
}
|
|
|
|
|
|
|
|
target "app" {
|
|
|
|
args = {
|
|
|
|
v1 = "pre-${FOO}"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
You can use this file directly:
|
|
|
|
|
|
|
|
```console
|
|
|
|
$ docker buildx bake --print app
|
|
|
|
```
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"group": {
|
|
|
|
"default": {
|
|
|
|
"targets": [
|
|
|
|
"app"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"target": {
|
|
|
|
"app": {
|
|
|
|
"context": ".",
|
|
|
|
"dockerfile": "Dockerfile",
|
|
|
|
"args": {
|
|
|
|
"v1": "pre-abc"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Or create an override configuration file:
|
|
|
|
|
|
|
|
```hcl
|
|
|
|
# env.hcl
|
|
|
|
WHOAMI="myuser"
|
|
|
|
FOO="def-${WHOAMI}"
|
|
|
|
```
|
|
|
|
|
|
|
|
And invoke bake together with both of the files:
|
|
|
|
|
|
|
|
```console
|
|
|
|
$ docker buildx bake -f docker-bake.hcl -f env.hcl --print app
|
|
|
|
```
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"group": {
|
|
|
|
"default": {
|
|
|
|
"targets": [
|
|
|
|
"app"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"target": {
|
|
|
|
"app": {
|
|
|
|
"context": ".",
|
|
|
|
"dockerfile": "Dockerfile",
|
|
|
|
"args": {
|
|
|
|
"v1": "pre-def-myuser"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
## From command line
|
|
|
|
|
|
|
|
You can also override target configurations from the command line with the
|
|
|
|
[`--set` flag](https://docs.docker.com/engine/reference/commandline/buildx_bake/#set):
|
|
|
|
|
|
|
|
```hcl
|
|
|
|
# docker-bake.hcl
|
|
|
|
target "app" {
|
|
|
|
args = {
|
|
|
|
mybuildarg = "foo"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
```console
|
|
|
|
$ docker buildx bake --set app.args.mybuildarg=bar --set app.platform=linux/arm64 app --print
|
|
|
|
```
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"group": {
|
|
|
|
"default": {
|
|
|
|
"targets": [
|
|
|
|
"app"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"target": {
|
|
|
|
"app": {
|
|
|
|
"context": ".",
|
|
|
|
"dockerfile": "Dockerfile",
|
|
|
|
"args": {
|
|
|
|
"mybuildarg": "bar"
|
|
|
|
},
|
|
|
|
"platforms": [
|
|
|
|
"linux/arm64"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Pattern matching syntax defined in [https://golang.org/pkg/path/#Match](https://golang.org/pkg/path/#Match)
|
|
|
|
is also supported:
|
|
|
|
|
|
|
|
```console
|
|
|
|
$ 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"
|
|
|
|
```
|
|
|
|
|
|
|
|
Complete list of overridable fields:
|
|
|
|
|
|
|
|
* `args`
|
|
|
|
* `cache-from`
|
|
|
|
* `cache-to`
|
|
|
|
* `context`
|
|
|
|
* `dockerfile`
|
|
|
|
* `labels`
|
|
|
|
* `no-cache`
|
|
|
|
* `output`
|
|
|
|
* `platform`
|
|
|
|
* `pull`
|
|
|
|
* `secrets`
|
|
|
|
* `ssh`
|
|
|
|
* `tags`
|
|
|
|
* `target`
|
|
|
|
|
|
|
|
## Using variables in variables across files
|
|
|
|
|
|
|
|
When multiple files are specified, one file can use variables defined in
|
|
|
|
another file.
|
|
|
|
|
|
|
|
```hcl
|
|
|
|
# docker-bake1.hcl
|
|
|
|
variable "FOO" {
|
|
|
|
default = upper("${BASE}def")
|
|
|
|
}
|
|
|
|
|
|
|
|
variable "BAR" {
|
|
|
|
default = "-${FOO}-"
|
|
|
|
}
|
|
|
|
|
|
|
|
target "app" {
|
|
|
|
args = {
|
|
|
|
v1 = "pre-${BAR}"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
```hcl
|
|
|
|
# docker-bake2.hcl
|
|
|
|
variable "BASE" {
|
|
|
|
default = "abc"
|
|
|
|
}
|
|
|
|
|
|
|
|
target "app" {
|
|
|
|
args = {
|
|
|
|
v2 = "${FOO}-post"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
```console
|
|
|
|
$ docker buildx bake -f docker-bake1.hcl -f docker-bake2.hcl --print app
|
|
|
|
```
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"group": {
|
|
|
|
"default": {
|
|
|
|
"targets": [
|
|
|
|
"app"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"target": {
|
|
|
|
"app": {
|
|
|
|
"context": ".",
|
|
|
|
"dockerfile": "Dockerfile",
|
|
|
|
"args": {
|
|
|
|
"v1": "pre--ABCDEF-",
|
|
|
|
"v2": "ABCDEF-post"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|