Building with Bake from a Compose file
Table of contents
Bake supports the Compose file format to parse a Compose file and translate each service to a target.
# docker-compose.yml
services:
webapp-dev:
build: &build-dev
dockerfile: Dockerfile.webapp
tags:
- docker.io/username/webapp:latest
cache_from:
- docker.io/username/webapp:cache
cache_to:
- docker.io/username/webapp:cache
webapp-release:
build:
<<: *build-dev
x-bake:
platforms:
- linux/amd64
- linux/arm64
db:
image: docker.io/username/db
build:
dockerfile: Dockerfile.db
$ docker buildx bake --print
{
"group": {
"default": {
"targets": ["db", "webapp-dev", "webapp-release"]
}
},
"target": {
"db": {
"context": ".",
"dockerfile": "Dockerfile.db",
"tags": ["docker.io/username/db"]
},
"webapp-dev": {
"context": ".",
"dockerfile": "Dockerfile.webapp",
"tags": ["docker.io/username/webapp:latest"],
"cache-from": ["docker.io/username/webapp:cache"],
"cache-to": ["docker.io/username/webapp:cache"]
},
"webapp-release": {
"context": ".",
"dockerfile": "Dockerfile.webapp",
"tags": ["docker.io/username/webapp:latest"],
"cache-from": ["docker.io/username/webapp:cache"],
"cache-to": ["docker.io/username/webapp:cache"],
"platforms": ["linux/amd64", "linux/arm64"]
}
}
}
The compose format has some limitations compared to the HCL format:
- Specifying variables or global scope attributes is not yet supported
inherits
service field is not supported, but you can use YAML anchors to reference other services, as demonstrated in the previous example with&build-dev
.
.env
file
You can declare default environment variables in an environment file named
.env
. This file will be loaded from the current working directory,
where the command is executed and applied to compose definitions passed
with -f
.
# docker-compose.yml
services:
webapp:
image: docker.io/username/webapp:${TAG:-v1.0.0}
build:
dockerfile: Dockerfile
# .env
TAG=v1.1.0
$ docker buildx bake --print
{
"group": {
"default": {
"targets": ["webapp"]
}
},
"target": {
"webapp": {
"context": ".",
"dockerfile": "Dockerfile",
"tags": ["docker.io/username/webapp:v1.1.0"]
}
}
}
Note
System environment variables take precedence over environment variables in
.env
file.
Extension field with x-bake
Where some fields are not available in the compose specification, you can use
the
special extension field
x-bake
in your compose file to evaluate extra fields:
# docker-compose.yml
services:
addon:
image: ct-addon:bar
build:
context: .
dockerfile: ./Dockerfile
args:
CT_ECR: foo
CT_TAG: bar
x-bake:
tags:
- ct-addon:foo
- ct-addon:alp
platforms:
- linux/amd64
- linux/arm64
cache-from:
- user/app:cache
- type=local,src=path/to/cache
cache-to:
- type=local,dest=path/to/cache
pull: true
aws:
image: ct-fake-aws:bar
build:
dockerfile: ./aws.Dockerfile
args:
CT_ECR: foo
CT_TAG: bar
x-bake:
secret:
- id=mysecret,src=./secret
- id=mysecret2,src=./secret2
platforms: linux/arm64
output: type=docker
no-cache: true
$ docker buildx bake --print
{
"group": {
"default": {
"targets": ["aws", "addon"]
}
},
"target": {
"addon": {
"context": ".",
"dockerfile": "./Dockerfile",
"args": {
"CT_ECR": "foo",
"CT_TAG": "bar"
},
"tags": ["ct-addon:foo", "ct-addon:alp"],
"cache-from": ["user/app:cache", "type=local,src=path/to/cache"],
"cache-to": ["type=local,dest=path/to/cache"],
"platforms": ["linux/amd64", "linux/arm64"],
"pull": true
},
"aws": {
"context": ".",
"dockerfile": "./aws.Dockerfile",
"args": {
"CT_ECR": "foo",
"CT_TAG": "bar"
},
"tags": ["ct-fake-aws:bar"],
"secret": ["id=mysecret,src=./secret", "id=mysecret2,src=./secret2"],
"platforms": ["linux/arm64"],
"output": ["type=docker"],
"no-cache": true
}
}
}
Complete list of valid fields for x-bake
:
cache-from
cache-to
contexts
no-cache
no-cache-filter
output
platforms
pull
secret
ssh
tags