mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 10:03:42 +08:00 
			
		
		
		
	Merge pull request #1140 from crazy-max/bake-docs
docs: bake guides and refactor reference
This commit is contained in:
		
							
								
								
									
										29
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								README.md
									
									
									
									
									
								
							@@ -32,14 +32,16 @@ Key features:
 | 
				
			|||||||
  - [Building with buildx](#building-with-buildx)
 | 
					  - [Building with buildx](#building-with-buildx)
 | 
				
			||||||
  - [Working with builder instances](#working-with-builder-instances)
 | 
					  - [Working with builder instances](#working-with-builder-instances)
 | 
				
			||||||
  - [Building multi-platform images](#building-multi-platform-images)
 | 
					  - [Building multi-platform images](#building-multi-platform-images)
 | 
				
			||||||
  - [High-level build options](#high-level-build-options)
 | 
					 | 
				
			||||||
- [Guides](docs/guides)
 | 
					- [Guides](docs/guides)
 | 
				
			||||||
 | 
					  - [High-level build options with Bake](docs/guides/bake/index.md)
 | 
				
			||||||
  - [CI/CD](docs/guides/cicd.md)
 | 
					  - [CI/CD](docs/guides/cicd.md)
 | 
				
			||||||
  - [CNI networking](docs/guides/cni-networking.md)
 | 
					  - [CNI networking](docs/guides/cni-networking.md)
 | 
				
			||||||
  - [Registry mirror](docs/guides/registry-mirror.md)
 | 
					 | 
				
			||||||
  - [Resource limiting](docs/guides/resource-limiting.md)
 | 
					 | 
				
			||||||
  - [Using a custom network](docs/guides/custom-network.md)
 | 
					  - [Using a custom network](docs/guides/custom-network.md)
 | 
				
			||||||
  - [Using a custom registry configuration](docs/guides/custom-registry-config.md)
 | 
					  - [Using a custom registry configuration](docs/guides/custom-registry-config.md)
 | 
				
			||||||
 | 
					  - [OpenTelemetry support](docs/guides/opentelemetry.md)
 | 
				
			||||||
 | 
					  - [Registry mirror](docs/guides/registry-mirror.md)
 | 
				
			||||||
 | 
					  - [Remote builder](docs/guides/remote-builder.md)
 | 
				
			||||||
 | 
					  - [Resource limiting](docs/guides/resource-limiting.md)
 | 
				
			||||||
- [Reference](docs/reference/buildx.md)
 | 
					- [Reference](docs/reference/buildx.md)
 | 
				
			||||||
  - [`buildx bake`](docs/reference/buildx_bake.md)
 | 
					  - [`buildx bake`](docs/reference/buildx_bake.md)
 | 
				
			||||||
  - [`buildx build`](docs/reference/buildx_build.md)
 | 
					  - [`buildx build`](docs/reference/buildx_build.md)
 | 
				
			||||||
@@ -319,26 +321,7 @@ cross-compilation helpers for more advanced use-cases.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## High-level build options
 | 
					## High-level build options
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Buildx also aims to provide support for high-level build concepts that go beyond
 | 
					See [`docs/guides/bake/index.md`](docs/guides/bake/index.md) for more details.
 | 
				
			||||||
invoking a single build command. We want to support building all the images in
 | 
					 | 
				
			||||||
your application together and let the users define project specific reusable
 | 
					 | 
				
			||||||
build flows that can then be easily invoked by anyone.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
BuildKit efficiently handles multiple concurrent build requests and
 | 
					 | 
				
			||||||
de-duplicating work. The build commands can be combined with general-purpose
 | 
					 | 
				
			||||||
command runners (for example, `make`). However, these tools generally invoke
 | 
					 | 
				
			||||||
builds in sequence  and therefore cannot leverage the full potential of BuildKit
 | 
					 | 
				
			||||||
parallelization, or combine BuildKit’s output for the user. For this use case,
 | 
					 | 
				
			||||||
we have added a command called [`docker buildx bake`](docs/reference/buildx_bake.md).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The `bake` command supports building images from compose files, similar to
 | 
					 | 
				
			||||||
[`docker-compose build`](https://docs.docker.com/compose/reference/build/),
 | 
					 | 
				
			||||||
but allowing all the services to be built concurrently as part of a single
 | 
					 | 
				
			||||||
request.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
There is also support for custom build rules from HCL/JSON files allowing
 | 
					 | 
				
			||||||
better code reuse and different target groups. The design of bake is in very
 | 
					 | 
				
			||||||
early stages and we are looking for feedback from users.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Contributing
 | 
					# Contributing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -528,7 +528,7 @@ type Target struct {
 | 
				
			|||||||
	NoCache          *bool             `json:"no-cache,omitempty" hcl:"no-cache,optional"`
 | 
						NoCache          *bool             `json:"no-cache,omitempty" hcl:"no-cache,optional"`
 | 
				
			||||||
	NetworkMode      *string           `json:"-" hcl:"-"`
 | 
						NetworkMode      *string           `json:"-" hcl:"-"`
 | 
				
			||||||
	NoCacheFilter    []string          `json:"no-cache-filter,omitempty" hcl:"no-cache-filter,optional"`
 | 
						NoCacheFilter    []string          `json:"no-cache-filter,omitempty" hcl:"no-cache-filter,optional"`
 | 
				
			||||||
	// IMPORTANT: if you add more fields here, do not forget to update newOverrides and README.
 | 
						// IMPORTANT: if you add more fields here, do not forget to update newOverrides and docs/guides/bake/file-definition.md.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// linked is a private field to mark a target used as a linked one
 | 
						// linked is a private field to mark a target used as a linked one
 | 
				
			||||||
	linked bool
 | 
						linked bool
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										77
									
								
								docs/guides/bake/build-contexts.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								docs/guides/bake/build-contexts.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					title: "Defining additional build contexts and linking targets"
 | 
				
			||||||
 | 
					keywords: build, buildx, bake, buildkit, hcl
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In addition to the main `context` key that defines the build context each target
 | 
				
			||||||
 | 
					can also define additional named contexts with a map defined with key `contexts`.
 | 
				
			||||||
 | 
					These values map to the `--build-context` flag in the [build command](https://docs.docker.com/engine/reference/commandline/buildx_build/#build-context).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Inside the Dockerfile these contexts can be used with the `FROM` instruction or `--from` flag.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The value can be a local source directory, container image (with `docker-image://` prefix),
 | 
				
			||||||
 | 
					Git URL, HTTP URL or a name of another target in the Bake file (with `target:` prefix).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Pinning alpine image
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```dockerfile
 | 
				
			||||||
 | 
					# syntax=docker/dockerfile:1
 | 
				
			||||||
 | 
					FROM alpine
 | 
				
			||||||
 | 
					RUN echo "Hello world"
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					target "app" {
 | 
				
			||||||
 | 
					  contexts = {
 | 
				
			||||||
 | 
					    alpine = "docker-image://alpine:3.13"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Using a secondary source directory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```dockerfile
 | 
				
			||||||
 | 
					# syntax=docker/dockerfile:1
 | 
				
			||||||
 | 
					FROM scratch AS src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FROM golang
 | 
				
			||||||
 | 
					COPY --from=src . .
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					target "app" {
 | 
				
			||||||
 | 
					  contexts = {
 | 
				
			||||||
 | 
					    src = "../path/to/source"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Using a result of one target as a base image in another target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To use a result of one target as a build context of another, specity the target
 | 
				
			||||||
 | 
					name with `target:` prefix.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```dockerfile
 | 
				
			||||||
 | 
					# syntax=docker/dockerfile:1
 | 
				
			||||||
 | 
					FROM baseapp
 | 
				
			||||||
 | 
					RUN echo "Hello world"
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					target "base" {
 | 
				
			||||||
 | 
					  dockerfile = "baseapp.Dockerfile"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "app" {
 | 
				
			||||||
 | 
					  contexts = {
 | 
				
			||||||
 | 
					    baseapp = "target:base"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please note that in most cases you should just use a single multi-stage
 | 
				
			||||||
 | 
					Dockerfile with multiple targets for similar behavior. This case is recommended
 | 
				
			||||||
 | 
					when you have multiple Dockerfiles that can't be easily merged into one.
 | 
				
			||||||
							
								
								
									
										222
									
								
								docs/guides/bake/compose-file.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										222
									
								
								docs/guides/bake/compose-file.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,222 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					title: "Building from Compose file"
 | 
				
			||||||
 | 
					keywords: build, buildx, bake, buildkit, compose
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Specification
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bake uses the [compose-spec](https://docs.docker.com/compose/compose-file/) to
 | 
				
			||||||
 | 
					parse a compose file and translate each service to a [target](file-definition.md#target).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					# 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
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake --print
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "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"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unlike the [HCL format](file-definition.md#hcl-definition), there are some
 | 
				
			||||||
 | 
					limitations with the compose format:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Specifying variables or global scope attributes is not yet supported
 | 
				
			||||||
 | 
					* `inherits` service field is not supported, but you can use [YAML anchors](https://docs.docker.com/compose/compose-file/#fragments) to reference other services like the example above
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Extension field with `x-bake`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Even if some fields are not (yet) available in the compose specification, you
 | 
				
			||||||
 | 
					can use the [special extension](https://docs.docker.com/compose/compose-file/#extension)
 | 
				
			||||||
 | 
					field `x-bake` in your compose file to evaluate extra fields:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					# 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
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake --print
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "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`
 | 
				
			||||||
 | 
					* `no-cache`
 | 
				
			||||||
 | 
					* `no-cache-filter`
 | 
				
			||||||
 | 
					* `output`
 | 
				
			||||||
 | 
					* `platforms`
 | 
				
			||||||
 | 
					* `pull`
 | 
				
			||||||
 | 
					* `secret`
 | 
				
			||||||
 | 
					* `ssh`
 | 
				
			||||||
 | 
					* `tags`
 | 
				
			||||||
							
								
								
									
										219
									
								
								docs/guides/bake/configuring-build.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								docs/guides/bake/configuring-build.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,219 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					title: "Configuring builds"
 | 
				
			||||||
 | 
					keywords: build, buildx, bake, buildkit, hcl, json
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
							
								
								
									
										439
									
								
								docs/guides/bake/file-definition.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										439
									
								
								docs/guides/bake/file-definition.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,439 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					title: "Bake file definition"
 | 
				
			||||||
 | 
					keywords: build, buildx, bake, buildkit, hcl, json, compose
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`buildx bake` supports HCL, JSON and Compose file format for defining build
 | 
				
			||||||
 | 
					[groups](#group), [targets](#target) as well as [variables](#variable) and
 | 
				
			||||||
 | 
					[functions](#functions). It looks for build definition files in the current
 | 
				
			||||||
 | 
					directory in the following order:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `docker-compose.yml`
 | 
				
			||||||
 | 
					* `docker-compose.yaml`
 | 
				
			||||||
 | 
					* `docker-bake.json`
 | 
				
			||||||
 | 
					* `docker-bake.override.json`
 | 
				
			||||||
 | 
					* `docker-bake.hcl`
 | 
				
			||||||
 | 
					* `docker-bake.override.hcl`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Specification
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Inside a bake file you can declare group, target and variable blocks to define
 | 
				
			||||||
 | 
					project specific reusable build flows.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A target reflects a single docker build invocation with the same options that
 | 
				
			||||||
 | 
					you would specify for `docker build`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					target "webapp-dev" {
 | 
				
			||||||
 | 
					  dockerfile = "Dockerfile.webapp"
 | 
				
			||||||
 | 
					  tags = ["docker.io/username/webapp:latest"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake webapp-dev
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> **Note**
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> In the case of compose files, each service corresponds to a target.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Complete list of valid target fields available for [HCL](#hcl-definition) and
 | 
				
			||||||
 | 
					[JSON](#json-definition) definitions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `args`
 | 
				
			||||||
 | 
					* `cache-from`
 | 
				
			||||||
 | 
					* `cache-to`
 | 
				
			||||||
 | 
					* `context`
 | 
				
			||||||
 | 
					* `contexts`
 | 
				
			||||||
 | 
					* `dockerfile`
 | 
				
			||||||
 | 
					* `inherits`
 | 
				
			||||||
 | 
					* `labels`
 | 
				
			||||||
 | 
					* `no-cache`
 | 
				
			||||||
 | 
					* `no-cache-filter`
 | 
				
			||||||
 | 
					* `output`
 | 
				
			||||||
 | 
					* `platform`
 | 
				
			||||||
 | 
					* `pull`
 | 
				
			||||||
 | 
					* `secrets`
 | 
				
			||||||
 | 
					* `ssh`
 | 
				
			||||||
 | 
					* `tags`
 | 
				
			||||||
 | 
					* `target`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Group
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A group is a grouping of targets:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					group "build" {
 | 
				
			||||||
 | 
					  targets = ["db", "webapp-dev"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "webapp-dev" {
 | 
				
			||||||
 | 
					  dockerfile = "Dockerfile.webapp"
 | 
				
			||||||
 | 
					  tags = ["docker.io/username/webapp:latest"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "db" {
 | 
				
			||||||
 | 
					  dockerfile = "Dockerfile.db"
 | 
				
			||||||
 | 
					  tags = ["docker.io/username/db"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake build
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Variable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Similar to how Terraform provides a way to [define variables](https://www.terraform.io/docs/configuration/variables.html#declaring-an-input-variable),
 | 
				
			||||||
 | 
					the HCL file format also supports variable block definitions. These can be used
 | 
				
			||||||
 | 
					to define variables with values provided by the current environment, or a
 | 
				
			||||||
 | 
					default value when unset:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					variable "TAG" {
 | 
				
			||||||
 | 
					  default = "latest"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "webapp-dev" {
 | 
				
			||||||
 | 
					  dockerfile = "Dockerfile.webapp"
 | 
				
			||||||
 | 
					  tags = ["docker.io/username/webapp:${TAG}"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake webapp-dev          # will use the default value "latest"
 | 
				
			||||||
 | 
					$ TAG=dev docker buildx bake webapp-dev  # will use the TAG environment variable value
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> **Tip**
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> See also the [Configuring builds](configuring-build.md) page for advanced usage.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Functions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A [set of generally useful functions](https://github.com/docker/buildx/blob/master/bake/hclparser/stdlib.go)
 | 
				
			||||||
 | 
					provided by [go-cty](https://github.com/zclconf/go-cty/tree/main/cty/function/stdlib)
 | 
				
			||||||
 | 
					are available for use in HCL files:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					target "webapp-dev" {
 | 
				
			||||||
 | 
					  dockerfile = "Dockerfile.webapp"
 | 
				
			||||||
 | 
					  tags = ["docker.io/username/webapp:latest"]
 | 
				
			||||||
 | 
					  args = {
 | 
				
			||||||
 | 
					    buildno = "${add(123, 1)}"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In addition, [user defined functions](https://github.com/hashicorp/hcl/tree/main/ext/userfunc)
 | 
				
			||||||
 | 
					are also supported:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					function "increment" {
 | 
				
			||||||
 | 
					  params = [number]
 | 
				
			||||||
 | 
					  result = number + 1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "webapp-dev" {
 | 
				
			||||||
 | 
					  dockerfile = "Dockerfile.webapp"
 | 
				
			||||||
 | 
					  tags = ["docker.io/username/webapp:latest"]
 | 
				
			||||||
 | 
					  args = {
 | 
				
			||||||
 | 
					    buildno = "${increment(123)}"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> **Note**
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> See [User defined HCL functions](hcl-funcs.md) page for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Built-in variables
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `BAKE_CMD_CONTEXT` can be used to access the main `context` for bake command
 | 
				
			||||||
 | 
					  from a bake file that has been [imported remotely](file-definition.md#remote-definition).
 | 
				
			||||||
 | 
					* `BAKE_LOCAL_PLATFORM` returns the current platform's default platform
 | 
				
			||||||
 | 
					  specification (e.g. `linux/amd64`).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Merging and inheritance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Multiple files can include the same target and final build options will be
 | 
				
			||||||
 | 
					determined by merging them together:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					target "webapp-dev" {
 | 
				
			||||||
 | 
					  dockerfile = "Dockerfile.webapp"
 | 
				
			||||||
 | 
					  tags = ["docker.io/username/webapp:latest"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake2.hcl
 | 
				
			||||||
 | 
					target "webapp-dev" {
 | 
				
			||||||
 | 
					  tags = ["docker.io/username/webapp:dev"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake -f docker-bake.hcl -f docker-bake2.hcl webapp-dev
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A group can specify its list of targets with the `targets` option. A target can
 | 
				
			||||||
 | 
					inherit build options by setting the `inherits` option to the list of targets or
 | 
				
			||||||
 | 
					groups to inherit from:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					target "webapp-dev" {
 | 
				
			||||||
 | 
					  dockerfile = "Dockerfile.webapp"
 | 
				
			||||||
 | 
					  tags = ["docker.io/username/webapp:${TAG}"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "webapp-release" {
 | 
				
			||||||
 | 
					  inherits = ["webapp-dev"]
 | 
				
			||||||
 | 
					  platforms = ["linux/amd64", "linux/arm64"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## `default` target/group
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When you invoke `bake` you specify what targets/groups you want to build. If no
 | 
				
			||||||
 | 
					arguments is specified, the group/target named `default` will be built:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					target "default" {
 | 
				
			||||||
 | 
					  dockerfile = "Dockerfile.webapp"
 | 
				
			||||||
 | 
					  tags = ["docker.io/username/webapp:latest"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Definitions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### HCL definition
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					HCL definition file is recommended as its experience is more aligned with buildx UX
 | 
				
			||||||
 | 
					and also allows better code reuse, different target groups and extended features.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					variable "TAG" {
 | 
				
			||||||
 | 
					  default = "latest"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					group "default" {
 | 
				
			||||||
 | 
					  targets = ["db", "webapp-dev"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "webapp-dev" {
 | 
				
			||||||
 | 
					  dockerfile = "Dockerfile.webapp"
 | 
				
			||||||
 | 
					  tags = ["docker.io/username/webapp:${TAG}"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "webapp-release" {
 | 
				
			||||||
 | 
					  inherits = ["webapp-dev"]
 | 
				
			||||||
 | 
					  platforms = ["linux/amd64", "linux/arm64"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "db" {
 | 
				
			||||||
 | 
					  dockerfile = "Dockerfile.db"
 | 
				
			||||||
 | 
					  tags = ["docker.io/username/db"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### JSON definition
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "variable": {
 | 
				
			||||||
 | 
					    "TAG": {
 | 
				
			||||||
 | 
					      "default": "latest"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "group": {
 | 
				
			||||||
 | 
					    "default": {
 | 
				
			||||||
 | 
					      "targets": [
 | 
				
			||||||
 | 
					        "db",
 | 
				
			||||||
 | 
					        "webapp-dev"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "target": {
 | 
				
			||||||
 | 
					    "webapp-dev": {
 | 
				
			||||||
 | 
					      "dockerfile": "Dockerfile.webapp",
 | 
				
			||||||
 | 
					      "tags": [
 | 
				
			||||||
 | 
					        "docker.io/username/webapp:${TAG}"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "webapp-release": {
 | 
				
			||||||
 | 
					      "inherits": [
 | 
				
			||||||
 | 
					        "webapp-dev"
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      "platforms": [
 | 
				
			||||||
 | 
					        "linux/amd64",
 | 
				
			||||||
 | 
					        "linux/arm64"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "db": {
 | 
				
			||||||
 | 
					      "dockerfile": "Dockerfile.db",
 | 
				
			||||||
 | 
					      "tags": [
 | 
				
			||||||
 | 
					        "docker.io/username/db"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Compose file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					# docker-compose.yml
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  webapp:
 | 
				
			||||||
 | 
					    image: docker.io/username/webapp:latest
 | 
				
			||||||
 | 
					    build:
 | 
				
			||||||
 | 
					      dockerfile: Dockerfile.webapp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  db:
 | 
				
			||||||
 | 
					    image: docker.io/username/db
 | 
				
			||||||
 | 
					    build:
 | 
				
			||||||
 | 
					      dockerfile: Dockerfile.db
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> **Note**
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> See [Building from Compose file](compose-file.md) page for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Remote definition
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can also build bake files directly from a remote Git repository or HTTPS URL:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake "https://github.com/docker/cli.git#v20.10.11" --print
 | 
				
			||||||
 | 
					#1 [internal] load git source https://github.com/docker/cli.git#v20.10.11
 | 
				
			||||||
 | 
					#1 0.745 e8f1871b077b64bcb4a13334b7146492773769f7       refs/tags/v20.10.11
 | 
				
			||||||
 | 
					#1 2.022 From https://github.com/docker/cli
 | 
				
			||||||
 | 
					#1 2.022  * [new tag]         v20.10.11  -> v20.10.11
 | 
				
			||||||
 | 
					#1 DONE 2.9s
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "group": {
 | 
				
			||||||
 | 
					    "default": {
 | 
				
			||||||
 | 
					      "targets": [
 | 
				
			||||||
 | 
					        "binary"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "target": {
 | 
				
			||||||
 | 
					    "binary": {
 | 
				
			||||||
 | 
					      "context": "https://github.com/docker/cli.git#v20.10.11",
 | 
				
			||||||
 | 
					      "dockerfile": "Dockerfile",
 | 
				
			||||||
 | 
					      "args": {
 | 
				
			||||||
 | 
					        "BASE_VARIANT": "alpine",
 | 
				
			||||||
 | 
					        "GO_STRIP": "",
 | 
				
			||||||
 | 
					        "VERSION": ""
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "target": "binary",
 | 
				
			||||||
 | 
					      "platforms": [
 | 
				
			||||||
 | 
					        "local"
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      "output": [
 | 
				
			||||||
 | 
					        "build"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					As you can see the context is fixed to `https://github.com/docker/cli.git` even if
 | 
				
			||||||
 | 
					[no context is actually defined](https://github.com/docker/cli/blob/2776a6d694f988c0c1df61cad4bfac0f54e481c8/docker-bake.hcl#L17-L26)
 | 
				
			||||||
 | 
					in the definition.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If you want to access the main context for bake command from a bake file
 | 
				
			||||||
 | 
					that has been imported remotely, you can use the [`BAKE_CMD_CONTEXT` built-in var](#built-in-variables).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ cat https://raw.githubusercontent.com/tonistiigi/buildx/remote-test/docker-bake.hcl
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					target "default" {
 | 
				
			||||||
 | 
					  context = BAKE_CMD_CONTEXT
 | 
				
			||||||
 | 
					  dockerfile-inline = <<EOT
 | 
				
			||||||
 | 
					FROM alpine
 | 
				
			||||||
 | 
					WORKDIR /src
 | 
				
			||||||
 | 
					COPY . .
 | 
				
			||||||
 | 
					RUN ls -l && stop
 | 
				
			||||||
 | 
					EOT
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake "https://github.com/tonistiigi/buildx.git#remote-test" --print
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "target": {
 | 
				
			||||||
 | 
					    "default": {
 | 
				
			||||||
 | 
					      "context": ".",
 | 
				
			||||||
 | 
					      "dockerfile": "Dockerfile",
 | 
				
			||||||
 | 
					      "dockerfile-inline": "FROM alpine\nWORKDIR /src\nCOPY . .\nRUN ls -l \u0026\u0026 stop\n"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ touch foo bar
 | 
				
			||||||
 | 
					$ docker buildx bake "https://github.com/tonistiigi/buildx.git#remote-test"
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```text
 | 
				
			||||||
 | 
					...
 | 
				
			||||||
 | 
					 > [4/4] RUN ls -l && stop:
 | 
				
			||||||
 | 
					#8 0.101 total 0
 | 
				
			||||||
 | 
					#8 0.102 -rw-r--r--    1 root     root             0 Jul 27 18:47 bar
 | 
				
			||||||
 | 
					#8 0.102 -rw-r--r--    1 root     root             0 Jul 27 18:47 foo
 | 
				
			||||||
 | 
					#8 0.102 /bin/sh: stop: not found
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake "https://github.com/tonistiigi/buildx.git#remote-test" "https://github.com/docker/cli.git#v20.10.11" --print
 | 
				
			||||||
 | 
					#1 [internal] load git source https://github.com/tonistiigi/buildx.git#remote-test
 | 
				
			||||||
 | 
					#1 0.429 577303add004dd7efeb13434d69ea030d35f7888       refs/heads/remote-test
 | 
				
			||||||
 | 
					#1 CACHED
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "target": {
 | 
				
			||||||
 | 
					    "default": {
 | 
				
			||||||
 | 
					      "context": "https://github.com/docker/cli.git#v20.10.11",
 | 
				
			||||||
 | 
					      "dockerfile": "Dockerfile",
 | 
				
			||||||
 | 
					      "dockerfile-inline": "FROM alpine\nWORKDIR /src\nCOPY . .\nRUN ls -l \u0026\u0026 stop\n"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake "https://github.com/tonistiigi/buildx.git#remote-test" "https://github.com/docker/cli.git#v20.10.11"
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```text
 | 
				
			||||||
 | 
					...
 | 
				
			||||||
 | 
					 > [4/4] RUN ls -l && stop:
 | 
				
			||||||
 | 
					#8 0.136 drwxrwxrwx    5 root     root          4096 Jul 27 18:31 kubernetes
 | 
				
			||||||
 | 
					#8 0.136 drwxrwxrwx    3 root     root          4096 Jul 27 18:31 man
 | 
				
			||||||
 | 
					#8 0.136 drwxrwxrwx    2 root     root          4096 Jul 27 18:31 opts
 | 
				
			||||||
 | 
					#8 0.136 -rw-rw-rw-    1 root     root          1893 Jul 27 18:31 poule.yml
 | 
				
			||||||
 | 
					#8 0.136 drwxrwxrwx    7 root     root          4096 Jul 27 18:31 scripts
 | 
				
			||||||
 | 
					#8 0.136 drwxrwxrwx    3 root     root          4096 Jul 27 18:31 service
 | 
				
			||||||
 | 
					#8 0.136 drwxrwxrwx    2 root     root          4096 Jul 27 18:31 templates
 | 
				
			||||||
 | 
					#8 0.136 drwxrwxrwx   10 root     root          4096 Jul 27 18:31 vendor
 | 
				
			||||||
 | 
					#8 0.136 -rwxrwxrwx    1 root     root          9620 Jul 27 18:31 vendor.conf
 | 
				
			||||||
 | 
					#8 0.136 /bin/sh: stop: not found
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
							
								
								
									
										330
									
								
								docs/guides/bake/hcl-funcs.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										330
									
								
								docs/guides/bake/hcl-funcs.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,330 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					title: "User defined HCL functions"
 | 
				
			||||||
 | 
					keywords: build, buildx, bake, buildkit, hcl
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Using interpolation to tag an image with the git sha
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					As shown in the [File definition](file-definition.md#variable) page, `bake`
 | 
				
			||||||
 | 
					supports variable blocks which are assigned to matching environment variables
 | 
				
			||||||
 | 
					or default values:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					variable "TAG" {
 | 
				
			||||||
 | 
					  default = "latest"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					group "default" {
 | 
				
			||||||
 | 
					  targets = ["webapp"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "webapp" {
 | 
				
			||||||
 | 
					  tags = ["docker.io/username/webapp:${TAG}"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					alternatively, in json format:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "variable": {
 | 
				
			||||||
 | 
					    "TAG": {
 | 
				
			||||||
 | 
					      "default": "latest"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "group": {
 | 
				
			||||||
 | 
					    "default": {
 | 
				
			||||||
 | 
					      "targets": ["webapp"]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "target": {
 | 
				
			||||||
 | 
					    "webapp": {
 | 
				
			||||||
 | 
					      "tags": ["docker.io/username/webapp:${TAG}"]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake --print webapp
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "group": {
 | 
				
			||||||
 | 
					    "default": {
 | 
				
			||||||
 | 
					      "targets": [
 | 
				
			||||||
 | 
					        "webapp"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "target": {
 | 
				
			||||||
 | 
					    "webapp": {
 | 
				
			||||||
 | 
					      "context": ".",
 | 
				
			||||||
 | 
					      "dockerfile": "Dockerfile",
 | 
				
			||||||
 | 
					      "tags": [
 | 
				
			||||||
 | 
					        "docker.io/username/webapp:latest"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ TAG=$(git rev-parse --short HEAD) docker buildx bake --print webapp
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "group": {
 | 
				
			||||||
 | 
					    "default": {
 | 
				
			||||||
 | 
					      "targets": [
 | 
				
			||||||
 | 
					        "webapp"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "target": {
 | 
				
			||||||
 | 
					    "webapp": {
 | 
				
			||||||
 | 
					      "context": ".",
 | 
				
			||||||
 | 
					      "dockerfile": "Dockerfile",
 | 
				
			||||||
 | 
					      "tags": [
 | 
				
			||||||
 | 
					        "docker.io/username/webapp:985e9e9"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Using the `add` function
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can use [`go-cty` stdlib functions](https://github.com/zclconf/go-cty/tree/main/cty/function/stdlib).
 | 
				
			||||||
 | 
					Here we are using the `add` function.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					variable "TAG" {
 | 
				
			||||||
 | 
					  default = "latest"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					group "default" {
 | 
				
			||||||
 | 
					  targets = ["webapp"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "webapp" {
 | 
				
			||||||
 | 
					  args = {
 | 
				
			||||||
 | 
					    buildno = "${add(123, 1)}"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake --print webapp
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "group": {
 | 
				
			||||||
 | 
					    "default": {
 | 
				
			||||||
 | 
					      "targets": [
 | 
				
			||||||
 | 
					        "webapp"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "target": {
 | 
				
			||||||
 | 
					    "webapp": {
 | 
				
			||||||
 | 
					      "context": ".",
 | 
				
			||||||
 | 
					      "dockerfile": "Dockerfile",
 | 
				
			||||||
 | 
					      "args": {
 | 
				
			||||||
 | 
					        "buildno": "124"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Defining an `increment` function
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It also supports [user defined functions](https://github.com/hashicorp/hcl/tree/main/ext/userfunc).
 | 
				
			||||||
 | 
					The following example defines a simple an `increment` function.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# 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
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "group": {
 | 
				
			||||||
 | 
					    "default": {
 | 
				
			||||||
 | 
					      "targets": [
 | 
				
			||||||
 | 
					        "webapp"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "target": {
 | 
				
			||||||
 | 
					    "webapp": {
 | 
				
			||||||
 | 
					      "context": ".",
 | 
				
			||||||
 | 
					      "dockerfile": "Dockerfile",
 | 
				
			||||||
 | 
					      "args": {
 | 
				
			||||||
 | 
					        "buildno": "124"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Only adding tags if a variable is not empty using an `notequal`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Here we are using the conditional `notequal` function which is just for
 | 
				
			||||||
 | 
					symmetry with the `equal` one.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					variable "TAG" {default="" }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					group "default" {
 | 
				
			||||||
 | 
					  targets = [
 | 
				
			||||||
 | 
					    "webapp",
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "webapp" {
 | 
				
			||||||
 | 
					  context="."
 | 
				
			||||||
 | 
					  dockerfile="Dockerfile"
 | 
				
			||||||
 | 
					  tags = [
 | 
				
			||||||
 | 
					    "my-image:latest",
 | 
				
			||||||
 | 
					    notequal("",TAG) ? "my-image:${TAG}": "",
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake --print webapp
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "group": {
 | 
				
			||||||
 | 
					    "default": {
 | 
				
			||||||
 | 
					      "targets": [
 | 
				
			||||||
 | 
					        "webapp"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "target": {
 | 
				
			||||||
 | 
					    "webapp": {
 | 
				
			||||||
 | 
					      "context": ".",
 | 
				
			||||||
 | 
					      "dockerfile": "Dockerfile",
 | 
				
			||||||
 | 
					      "tags": [
 | 
				
			||||||
 | 
					        "my-image:latest"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Using variables in functions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can refer variables to other variables like the target blocks can. Stdlib
 | 
				
			||||||
 | 
					functions can also be called but user functions can't at the moment.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					variable "REPO" {
 | 
				
			||||||
 | 
					  default = "user/repo"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function "tag" {
 | 
				
			||||||
 | 
					  params = [tag]
 | 
				
			||||||
 | 
					  result = ["${REPO}:${tag}"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "webapp" {
 | 
				
			||||||
 | 
					  tags = tag("v1")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake --print webapp
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "group": {
 | 
				
			||||||
 | 
					    "default": {
 | 
				
			||||||
 | 
					      "targets": [
 | 
				
			||||||
 | 
					        "webapp"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "target": {
 | 
				
			||||||
 | 
					    "webapp": {
 | 
				
			||||||
 | 
					      "context": ".",
 | 
				
			||||||
 | 
					      "dockerfile": "Dockerfile",
 | 
				
			||||||
 | 
					      "tags": [
 | 
				
			||||||
 | 
					        "user/repo:v1"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Using typed variables
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Non-string variables are also accepted. The value passed with env is parsed
 | 
				
			||||||
 | 
					into suitable type first.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```hcl
 | 
				
			||||||
 | 
					# docker-bake.hcl
 | 
				
			||||||
 | 
					variable "FOO" {
 | 
				
			||||||
 | 
					  default = 3
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					variable "IS_FOO" {
 | 
				
			||||||
 | 
					  default = true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target "app" {
 | 
				
			||||||
 | 
					  args = {
 | 
				
			||||||
 | 
					    v1 = FOO > 5 ? "higher" : "lower" 
 | 
				
			||||||
 | 
					    v2 = IS_FOO ? "yes" : "no"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```console
 | 
				
			||||||
 | 
					$ docker buildx bake --print app
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "group": {
 | 
				
			||||||
 | 
					    "default": {
 | 
				
			||||||
 | 
					      "targets": [
 | 
				
			||||||
 | 
					        "app"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "target": {
 | 
				
			||||||
 | 
					    "app": {
 | 
				
			||||||
 | 
					      "context": ".",
 | 
				
			||||||
 | 
					      "dockerfile": "Dockerfile",
 | 
				
			||||||
 | 
					      "args": {
 | 
				
			||||||
 | 
					        "v1": "lower",
 | 
				
			||||||
 | 
					        "v2": "yes"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
							
								
								
									
										39
									
								
								docs/guides/bake/index.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								docs/guides/bake/index.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					title: "High-level build options with Bake"
 | 
				
			||||||
 | 
					keywords: build, buildx, bake, buildkit, hcl, json, compose
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> This command is experimental.
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> The design of bake is in early stages, and we are looking for [feedback from users](https://github.com/docker/buildx/issues).
 | 
				
			||||||
 | 
					{: .important }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Buildx also aims to provide support for high-level build concepts that go beyond
 | 
				
			||||||
 | 
					invoking a single build command. We want to support building all the images in
 | 
				
			||||||
 | 
					your application together and let the users define project specific reusable
 | 
				
			||||||
 | 
					build flows that can then be easily invoked by anyone.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[BuildKit](https://github.com/moby/buildkit) efficiently handles multiple
 | 
				
			||||||
 | 
					concurrent build requests and de-duplicating work. The build commands can be
 | 
				
			||||||
 | 
					combined with general-purpose command runners (for example, `make`). However,
 | 
				
			||||||
 | 
					these tools generally invoke builds in sequence  and therefore cannot leverage
 | 
				
			||||||
 | 
					the full potential of BuildKit parallelization, or combine BuildKit's output
 | 
				
			||||||
 | 
					for the user. For this use case, we have added a command called
 | 
				
			||||||
 | 
					[`docker buildx bake`](https://docs.docker.com/engine/reference/commandline/buildx_bake/).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The `bake` command supports building images from HCL, JSON and Compose files.
 | 
				
			||||||
 | 
					This is similar to [`docker compose build`](https://docs.docker.com/compose/reference/build/),
 | 
				
			||||||
 | 
					but allowing all the services to be built concurrently as part of a single
 | 
				
			||||||
 | 
					request. If multiple files are specified they are all read and configurations are
 | 
				
			||||||
 | 
					combined.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We recommend using HCL files as its experience is more aligned with buildx UX
 | 
				
			||||||
 | 
					and also allows better code reuse, different target groups and extended features.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Next steps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* [File definition](file-definition.md)
 | 
				
			||||||
 | 
					* [Configuring builds](configuring-build.md)
 | 
				
			||||||
 | 
					* [User defined HCL functions](hcl-funcs.md)
 | 
				
			||||||
 | 
					* [Defining additional build contexts and linking targets](build-contexts.md)
 | 
				
			||||||
 | 
					* [Building from Compose file](compose-file.md)
 | 
				
			||||||
@@ -14,7 +14,7 @@ debug = true
 | 
				
			|||||||
  mirrors = ["mirror.gcr.io"]
 | 
					  mirrors = ["mirror.gcr.io"]
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
> **Notes**
 | 
					> **Note**
 | 
				
			||||||
>
 | 
					>
 | 
				
			||||||
> `debug = true` has been added to be able to debug requests
 | 
					> `debug = true` has been added to be able to debug requests
 | 
				
			||||||
> in the BuildKit daemon and see if the mirror is effectively used.
 | 
					> in the BuildKit daemon and see if the mirror is effectively used.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,12 +34,14 @@ Build from a file
 | 
				
			|||||||
Bake is a high-level build command. Each specified target will run in parallel
 | 
					Bake is a high-level build command. Each specified target will run in parallel
 | 
				
			||||||
as part of the build.
 | 
					as part of the build.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Read [High-level build options](https://github.com/docker/buildx#high-level-build-options)
 | 
					Read [High-level build options with Bake](https://docs.docker.com/build/bake/)
 | 
				
			||||||
for introduction.
 | 
					guide for introduction to writing bake files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Please note that `buildx bake` command may receive backwards incompatible
 | 
					> **Note**
 | 
				
			||||||
features in the future if needed. We are looking for feedback on improving the
 | 
					>
 | 
				
			||||||
command and extending the functionality further.
 | 
					> `buildx bake` command may receive backwards incompatible features in the future
 | 
				
			||||||
 | 
					> if needed. We are looking for feedback on improving the command and extending
 | 
				
			||||||
 | 
					> the functionality further.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Examples
 | 
					## Examples
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -49,166 +51,42 @@ Same as [`buildx --builder`](buildx.md#builder).
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
### <a name="file"></a> Specify a build definition file (-f, --file)
 | 
					### <a name="file"></a> Specify a build definition file (-f, --file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
By default, `buildx bake` looks for build definition files in the current
 | 
					Use the `-f` / `--file` option to specify the build definition file to use.
 | 
				
			||||||
directory, the following are parsed:
 | 
					The file can be an HCL, JSON or Compose file. If multiple files are specified
 | 
				
			||||||
 | 
					 | 
				
			||||||
- `docker-compose.yml`
 | 
					 | 
				
			||||||
- `docker-compose.yaml`
 | 
					 | 
				
			||||||
- `docker-bake.json`
 | 
					 | 
				
			||||||
- `docker-bake.override.json`
 | 
					 | 
				
			||||||
- `docker-bake.hcl`
 | 
					 | 
				
			||||||
- `docker-bake.override.hcl`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Use the `-f` / `--file` option to specify the build definition file to use. The
 | 
					 | 
				
			||||||
file can be a Docker Compose, JSON or HCL file. If multiple files are specified
 | 
					 | 
				
			||||||
they are all read and configurations are combined.
 | 
					they are all read and configurations are combined.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The following example uses a Docker Compose file named `docker-compose.dev.yaml`
 | 
					You can pass the names of the targets to build, to build only specific target(s).
 | 
				
			||||||
as build definition file, and builds all targets in the file:
 | 
					The following example builds the `db` and `webapp-release` targets that are
 | 
				
			||||||
 | 
					defined in the `docker-bake.dev.hcl` file:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```console
 | 
					```hcl
 | 
				
			||||||
$ docker buildx bake -f docker-compose.dev.yaml
 | 
					# docker-bake.dev.hcl
 | 
				
			||||||
 | 
					group "default" {
 | 
				
			||||||
[+] Building 66.3s (30/30) FINISHED
 | 
					  targets = ["db", "webapp-dev"]
 | 
				
			||||||
 => [frontend internal] load build definition from Dockerfile  0.1s
 | 
					 | 
				
			||||||
 => => transferring dockerfile: 36B                            0.0s
 | 
					 | 
				
			||||||
 => [backend internal] load build definition from Dockerfile   0.2s
 | 
					 | 
				
			||||||
 => => transferring dockerfile: 3.73kB                         0.0s
 | 
					 | 
				
			||||||
 => [database internal] load build definition from Dockerfile  0.1s
 | 
					 | 
				
			||||||
 => => transferring dockerfile: 5.77kB                         0.0s
 | 
					 | 
				
			||||||
 ...
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Pass the names of the targets to build, to build only specific target(s). The
 | 
					 | 
				
			||||||
following example builds the `backend` and `database` targets that are defined
 | 
					 | 
				
			||||||
in the `docker-compose.dev.yaml` file, skipping the build for the `frontend`
 | 
					 | 
				
			||||||
target:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```console
 | 
					 | 
				
			||||||
$ docker buildx bake -f docker-compose.dev.yaml backend database
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[+] Building 2.4s (13/13) FINISHED
 | 
					 | 
				
			||||||
 => [backend internal] load build definition from Dockerfile  0.1s
 | 
					 | 
				
			||||||
 => => transferring dockerfile: 81B                           0.0s
 | 
					 | 
				
			||||||
 => [database internal] load build definition from Dockerfile 0.2s
 | 
					 | 
				
			||||||
 => => transferring dockerfile: 36B                           0.0s
 | 
					 | 
				
			||||||
 => [backend internal] load .dockerignore                     0.3s
 | 
					 | 
				
			||||||
 ...
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
You can also use a remote `git` bake definition:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```console
 | 
					 | 
				
			||||||
$ docker buildx bake "https://github.com/docker/cli.git#v20.10.11" --print
 | 
					 | 
				
			||||||
#1 [internal] load git source https://github.com/docker/cli.git#v20.10.11
 | 
					 | 
				
			||||||
#1 0.745 e8f1871b077b64bcb4a13334b7146492773769f7       refs/tags/v20.10.11
 | 
					 | 
				
			||||||
#1 2.022 From https://github.com/docker/cli
 | 
					 | 
				
			||||||
#1 2.022  * [new tag]         v20.10.11  -> v20.10.11
 | 
					 | 
				
			||||||
#1 DONE 2.9s
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "group": {
 | 
					 | 
				
			||||||
    "default": {
 | 
					 | 
				
			||||||
      "targets": [
 | 
					 | 
				
			||||||
        "binary"
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "target": {
 | 
					 | 
				
			||||||
    "binary": {
 | 
					 | 
				
			||||||
      "context": "https://github.com/docker/cli.git#v20.10.11",
 | 
					 | 
				
			||||||
      "dockerfile": "Dockerfile",
 | 
					 | 
				
			||||||
      "args": {
 | 
					 | 
				
			||||||
        "BASE_VARIANT": "alpine",
 | 
					 | 
				
			||||||
        "GO_STRIP": "",
 | 
					 | 
				
			||||||
        "VERSION": ""
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "target": "binary",
 | 
					 | 
				
			||||||
      "platforms": [
 | 
					 | 
				
			||||||
        "local"
 | 
					 | 
				
			||||||
      ],
 | 
					 | 
				
			||||||
      "output": [
 | 
					 | 
				
			||||||
        "build"
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
As you can see the context is fixed to `https://github.com/docker/cli.git` even if
 | 
					target "webapp-dev" {
 | 
				
			||||||
[no context is actually defined](https://github.com/docker/cli/blob/2776a6d694f988c0c1df61cad4bfac0f54e481c8/docker-bake.hcl#L17-L26)
 | 
					  dockerfile = "Dockerfile.webapp"
 | 
				
			||||||
in the definition.
 | 
					  tags = ["docker.io/username/webapp"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
If you want to access the main context for bake command from a bake file
 | 
					target "webapp-release" {
 | 
				
			||||||
that has been imported remotely, you can use the `BAKE_CMD_CONTEXT` builtin var:
 | 
					  inherits = ["webapp-dev"]
 | 
				
			||||||
 | 
					  platforms = ["linux/amd64", "linux/arm64"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```console
 | 
					target "db" {
 | 
				
			||||||
$ cat https://raw.githubusercontent.com/tonistiigi/buildx/remote-test/docker-bake.hcl
 | 
					  dockerfile = "Dockerfile.db"
 | 
				
			||||||
target "default" {
 | 
					  tags = ["docker.io/username/db"]
 | 
				
			||||||
  context = BAKE_CMD_CONTEXT
 | 
					 | 
				
			||||||
  dockerfile-inline = <<EOT
 | 
					 | 
				
			||||||
FROM alpine
 | 
					 | 
				
			||||||
WORKDIR /src
 | 
					 | 
				
			||||||
COPY . .
 | 
					 | 
				
			||||||
RUN ls -l && stop
 | 
					 | 
				
			||||||
EOT
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```console
 | 
					```console
 | 
				
			||||||
$ docker buildx bake "https://github.com/tonistiigi/buildx.git#remote-test" --print
 | 
					$ docker buildx bake -f docker-bake.dev.hcl db webapp-release
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "target": {
 | 
					 | 
				
			||||||
    "default": {
 | 
					 | 
				
			||||||
      "context": ".",
 | 
					 | 
				
			||||||
      "dockerfile": "Dockerfile",
 | 
					 | 
				
			||||||
      "dockerfile-inline": "FROM alpine\nWORKDIR /src\nCOPY . .\nRUN ls -l \u0026\u0026 stop\n"
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```console
 | 
					See our [file definition](https://docs.docker.com/build/bake/file-definition/)
 | 
				
			||||||
$ touch foo bar
 | 
					guide for more details.
 | 
				
			||||||
$ docker buildx bake "https://github.com/tonistiigi/buildx.git#remote-test"
 | 
					 | 
				
			||||||
...
 | 
					 | 
				
			||||||
 > [4/4] RUN ls -l && stop:
 | 
					 | 
				
			||||||
#8 0.101 total 0
 | 
					 | 
				
			||||||
#8 0.102 -rw-r--r--    1 root     root             0 Jul 27 18:47 bar
 | 
					 | 
				
			||||||
#8 0.102 -rw-r--r--    1 root     root             0 Jul 27 18:47 foo
 | 
					 | 
				
			||||||
#8 0.102 /bin/sh: stop: not found
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```console
 | 
					 | 
				
			||||||
$ docker buildx bake "https://github.com/tonistiigi/buildx.git#remote-test" "https://github.com/docker/cli.git#v20.10.11" --print
 | 
					 | 
				
			||||||
#1 [internal] load git source https://github.com/tonistiigi/buildx.git#remote-test
 | 
					 | 
				
			||||||
#1 0.429 577303add004dd7efeb13434d69ea030d35f7888       refs/heads/remote-test
 | 
					 | 
				
			||||||
#1 CACHED
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "target": {
 | 
					 | 
				
			||||||
    "default": {
 | 
					 | 
				
			||||||
      "context": "https://github.com/docker/cli.git#v20.10.11",
 | 
					 | 
				
			||||||
      "dockerfile": "Dockerfile",
 | 
					 | 
				
			||||||
      "dockerfile-inline": "FROM alpine\nWORKDIR /src\nCOPY . .\nRUN ls -l \u0026\u0026 stop\n"
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```console
 | 
					 | 
				
			||||||
$ docker buildx bake "https://github.com/tonistiigi/buildx.git#remote-test" "https://github.com/docker/cli.git#v20.10.11"
 | 
					 | 
				
			||||||
...
 | 
					 | 
				
			||||||
 > [4/4] RUN ls -l && stop:
 | 
					 | 
				
			||||||
#8 0.136 drwxrwxrwx    5 root     root          4096 Jul 27 18:31 kubernetes
 | 
					 | 
				
			||||||
#8 0.136 drwxrwxrwx    3 root     root          4096 Jul 27 18:31 man
 | 
					 | 
				
			||||||
#8 0.136 drwxrwxrwx    2 root     root          4096 Jul 27 18:31 opts
 | 
					 | 
				
			||||||
#8 0.136 -rw-rw-rw-    1 root     root          1893 Jul 27 18:31 poule.yml
 | 
					 | 
				
			||||||
#8 0.136 drwxrwxrwx    7 root     root          4096 Jul 27 18:31 scripts
 | 
					 | 
				
			||||||
#8 0.136 drwxrwxrwx    3 root     root          4096 Jul 27 18:31 service
 | 
					 | 
				
			||||||
#8 0.136 drwxrwxrwx    2 root     root          4096 Jul 27 18:31 templates
 | 
					 | 
				
			||||||
#8 0.136 drwxrwxrwx   10 root     root          4096 Jul 27 18:31 vendor
 | 
					 | 
				
			||||||
#8 0.136 -rwxrwxrwx    1 root     root          9620 Jul 27 18:31 vendor.conf
 | 
					 | 
				
			||||||
#8 0.136 /bin/sh: stop: not found
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
### <a name="no-cache"></a> Do not use cache when building the image (--no-cache)
 | 
					### <a name="no-cache"></a> Do not use cache when building the image (--no-cache)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -286,701 +164,18 @@ $ docker buildx bake --set foo*.no-cache              # bypass caching only for
 | 
				
			|||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Complete list of overridable fields:
 | 
					Complete list of overridable fields:
 | 
				
			||||||
`args`, `cache-from`, `cache-to`, `context`, `dockerfile`, `labels`, `no-cache`,
 | 
					 | 
				
			||||||
`output`, `platform`, `pull`, `secrets`, `ssh`, `tags`, `target`
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
### File definition
 | 
					* `args`
 | 
				
			||||||
 | 
					* `cache-from`
 | 
				
			||||||
In addition to compose files, bake supports a JSON and an equivalent HCL file
 | 
					* `cache-to`
 | 
				
			||||||
format for defining build groups and targets.
 | 
					* `context`
 | 
				
			||||||
 | 
					* `dockerfile`
 | 
				
			||||||
A target reflects a single docker build invocation with the same options that
 | 
					* `labels`
 | 
				
			||||||
you would specify for `docker build`. A group is a grouping of targets.
 | 
					* `no-cache`
 | 
				
			||||||
 | 
					* `output`
 | 
				
			||||||
Multiple files can include the same target and final build options will be
 | 
					* `platform`
 | 
				
			||||||
determined by merging them together.
 | 
					* `pull`
 | 
				
			||||||
 | 
					* `secrets`
 | 
				
			||||||
In the case of compose files, each service corresponds to a target.
 | 
					* `ssh`
 | 
				
			||||||
 | 
					* `tags`
 | 
				
			||||||
A group can specify its list of targets with the `targets` option. A target can
 | 
					* `target`
 | 
				
			||||||
inherit build options by setting the `inherits` option to the list of targets or
 | 
					 | 
				
			||||||
groups to inherit from.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Note: Design of bake command is work in progress, the user experience may change
 | 
					 | 
				
			||||||
based on feedback.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
HCL definition example:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```hcl
 | 
					 | 
				
			||||||
group "default" {
 | 
					 | 
				
			||||||
    targets = ["db", "webapp-dev"]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
target "webapp-dev" {
 | 
					 | 
				
			||||||
    dockerfile = "Dockerfile.webapp"
 | 
					 | 
				
			||||||
    tags = ["docker.io/username/webapp"]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
target "webapp-release" {
 | 
					 | 
				
			||||||
    inherits = ["webapp-dev"]
 | 
					 | 
				
			||||||
    platforms = ["linux/amd64", "linux/arm64"]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
target "db" {
 | 
					 | 
				
			||||||
    dockerfile = "Dockerfile.db"
 | 
					 | 
				
			||||||
    tags = ["docker.io/username/db"]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Complete list of valid target fields:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
`args`, `cache-from`, `cache-to`, `context`, `contexts`, `dockerfile`, `inherits`, `labels`,
 | 
					 | 
				
			||||||
`no-cache`, `no-cache-filter`, `output`, `platform`, `pull`, `secrets`, `ssh`, `tags`, `target`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### 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
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "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
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "group": {
 | 
					 | 
				
			||||||
    "default": {
 | 
					 | 
				
			||||||
      "targets": [
 | 
					 | 
				
			||||||
        "app"
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "target": {
 | 
					 | 
				
			||||||
    "app": {
 | 
					 | 
				
			||||||
      "context": ".",
 | 
					 | 
				
			||||||
      "dockerfile": "Dockerfile",
 | 
					 | 
				
			||||||
      "args": {
 | 
					 | 
				
			||||||
        "v1": "pre-def-myuser"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### HCL variables and functions
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Similar to how Terraform provides a way to [define variables](https://www.terraform.io/docs/configuration/variables.html#declaring-an-input-variable),
 | 
					 | 
				
			||||||
the HCL file format also supports variable block definitions. These can be used
 | 
					 | 
				
			||||||
to define variables with values provided by the current environment, or a
 | 
					 | 
				
			||||||
default value when unset.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
A [set of generally useful functions](https://github.com/docker/buildx/blob/master/bake/hclparser/stdlib.go)
 | 
					 | 
				
			||||||
provided by [go-cty](https://github.com/zclconf/go-cty/tree/main/cty/function/stdlib)
 | 
					 | 
				
			||||||
are available for use in HCL files. In addition, [user defined functions](https://github.com/hashicorp/hcl/tree/main/ext/userfunc)
 | 
					 | 
				
			||||||
are also supported.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### Using interpolation to tag an image with the git sha
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Bake supports variable blocks which are assigned to matching environment
 | 
					 | 
				
			||||||
variables or default values.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```hcl
 | 
					 | 
				
			||||||
# docker-bake.hcl
 | 
					 | 
				
			||||||
variable "TAG" {
 | 
					 | 
				
			||||||
    default = "latest"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
group "default" {
 | 
					 | 
				
			||||||
    targets = ["webapp"]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
target "webapp" {
 | 
					 | 
				
			||||||
    tags = ["docker.io/username/webapp:${TAG}"]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alternatively, in json format:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```json
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "variable": {
 | 
					 | 
				
			||||||
    "TAG": {
 | 
					 | 
				
			||||||
      "default": "latest"
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  "group": {
 | 
					 | 
				
			||||||
    "default": {
 | 
					 | 
				
			||||||
      "targets": ["webapp"]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "target": {
 | 
					 | 
				
			||||||
    "webapp": {
 | 
					 | 
				
			||||||
      "tags": ["docker.io/username/webapp:${TAG}"]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```console
 | 
					 | 
				
			||||||
$ docker buildx bake --print webapp
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "group": {
 | 
					 | 
				
			||||||
    "default": {
 | 
					 | 
				
			||||||
      "targets": [
 | 
					 | 
				
			||||||
        "webapp"
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "target": {
 | 
					 | 
				
			||||||
    "webapp": {
 | 
					 | 
				
			||||||
      "context": ".",
 | 
					 | 
				
			||||||
      "dockerfile": "Dockerfile",
 | 
					 | 
				
			||||||
      "tags": [
 | 
					 | 
				
			||||||
        "docker.io/username/webapp:latest"
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```console
 | 
					 | 
				
			||||||
$ TAG=$(git rev-parse --short HEAD) docker buildx bake --print webapp
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "group": {
 | 
					 | 
				
			||||||
    "default": {
 | 
					 | 
				
			||||||
      "targets": [
 | 
					 | 
				
			||||||
        "webapp"
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "target": {
 | 
					 | 
				
			||||||
    "webapp": {
 | 
					 | 
				
			||||||
      "context": ".",
 | 
					 | 
				
			||||||
      "dockerfile": "Dockerfile",
 | 
					 | 
				
			||||||
      "tags": [
 | 
					 | 
				
			||||||
        "docker.io/username/webapp:985e9e9"
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### Using the `add` function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
You can use [`go-cty` stdlib functions](https://github.com/zclconf/go-cty/tree/main/cty/function/stdlib).
 | 
					 | 
				
			||||||
Here we are using the `add` function.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```hcl
 | 
					 | 
				
			||||||
# 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"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### Defining an `increment` function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
It also supports [user defined functions](https://github.com/hashicorp/hcl/tree/main/ext/userfunc).
 | 
					 | 
				
			||||||
The following example defines a simple an `increment` function.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```hcl
 | 
					 | 
				
			||||||
# 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"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### Only adding tags if a variable is not empty using an `notequal`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Here we are using the conditional `notequal` function which is just for
 | 
					 | 
				
			||||||
symmetry with the `equal` one.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```hcl
 | 
					 | 
				
			||||||
# docker-bake.hcl
 | 
					 | 
				
			||||||
variable "TAG" {default="" }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
group "default" {
 | 
					 | 
				
			||||||
    targets = [
 | 
					 | 
				
			||||||
        "webapp",
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
target "webapp" {
 | 
					 | 
				
			||||||
    context="."
 | 
					 | 
				
			||||||
    dockerfile="Dockerfile"
 | 
					 | 
				
			||||||
    tags = [
 | 
					 | 
				
			||||||
        "my-image:latest",
 | 
					 | 
				
			||||||
        notequal("",TAG) ? "my-image:${TAG}": "",
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```console
 | 
					 | 
				
			||||||
$ docker buildx bake --print webapp
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "group": {
 | 
					 | 
				
			||||||
    "default": {
 | 
					 | 
				
			||||||
      "targets": [
 | 
					 | 
				
			||||||
        "webapp"
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "target": {
 | 
					 | 
				
			||||||
    "webapp": {
 | 
					 | 
				
			||||||
      "context": ".",
 | 
					 | 
				
			||||||
      "dockerfile": "Dockerfile",
 | 
					 | 
				
			||||||
      "tags": [
 | 
					 | 
				
			||||||
        "my-image:latest"
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### Using variables in functions
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
You can refer variables to other variables like the target blocks can. Stdlib
 | 
					 | 
				
			||||||
functions can also be called but user functions can't at the moment.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```hcl
 | 
					 | 
				
			||||||
# docker-bake.hcl
 | 
					 | 
				
			||||||
variable "REPO" {
 | 
					 | 
				
			||||||
    default = "user/repo"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function "tag" {
 | 
					 | 
				
			||||||
    params = [tag]
 | 
					 | 
				
			||||||
    result = ["${REPO}:${tag}"]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
target "webapp" {
 | 
					 | 
				
			||||||
    tags = tag("v1")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```console
 | 
					 | 
				
			||||||
$ docker buildx bake --print webapp
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "group": {
 | 
					 | 
				
			||||||
    "default": {
 | 
					 | 
				
			||||||
      "targets": [
 | 
					 | 
				
			||||||
        "webapp"
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "target": {
 | 
					 | 
				
			||||||
    "webapp": {
 | 
					 | 
				
			||||||
      "context": ".",
 | 
					 | 
				
			||||||
      "dockerfile": "Dockerfile",
 | 
					 | 
				
			||||||
      "tags": [
 | 
					 | 
				
			||||||
        "user/repo:v1"
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### 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
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "group": {
 | 
					 | 
				
			||||||
    "default": {
 | 
					 | 
				
			||||||
      "targets": [
 | 
					 | 
				
			||||||
        "app"
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "target": {
 | 
					 | 
				
			||||||
    "app": {
 | 
					 | 
				
			||||||
      "context": ".",
 | 
					 | 
				
			||||||
      "dockerfile": "Dockerfile",
 | 
					 | 
				
			||||||
      "args": {
 | 
					 | 
				
			||||||
        "v1": "pre--ABCDEF-",
 | 
					 | 
				
			||||||
        "v2": "ABCDEF-post"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### Using typed variables
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Non-string variables are also accepted. The value passed with env is parsed
 | 
					 | 
				
			||||||
into suitable type first.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```hcl
 | 
					 | 
				
			||||||
# docker-bake.hcl
 | 
					 | 
				
			||||||
variable "FOO" {
 | 
					 | 
				
			||||||
    default = 3
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
variable "IS_FOO" {
 | 
					 | 
				
			||||||
    default = true
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
target "app" {
 | 
					 | 
				
			||||||
    args = {
 | 
					 | 
				
			||||||
        v1 = FOO > 5 ? "higher" : "lower" 
 | 
					 | 
				
			||||||
        v2 = IS_FOO ? "yes" : "no"
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```console
 | 
					 | 
				
			||||||
$ docker buildx bake --print app
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "group": {
 | 
					 | 
				
			||||||
    "default": {
 | 
					 | 
				
			||||||
      "targets": [
 | 
					 | 
				
			||||||
        "app"
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "target": {
 | 
					 | 
				
			||||||
    "app": {
 | 
					 | 
				
			||||||
      "context": ".",
 | 
					 | 
				
			||||||
      "dockerfile": "Dockerfile",
 | 
					 | 
				
			||||||
      "args": {
 | 
					 | 
				
			||||||
        "v1": "lower",
 | 
					 | 
				
			||||||
        "v2": "yes"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Defining additional build contexts and linking targets
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
In addition to the main `context` key that defines the build context each target can also define additional named contexts with a map defined with key `contexts`. These values map to the `--build-context` flag in the [build command](buildx_build.md#build-context).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Inside the Dockerfile these contexts can be used with the `FROM` instruction or `--from` flag.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The value can be a local source directory, container image (with docker-image:// prefix), Git URL, HTTP URL or a name of another target in the Bake file (with target: prefix).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### Pinning alpine image
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```Dockerfile
 | 
					 | 
				
			||||||
# Dockerfile
 | 
					 | 
				
			||||||
FROM alpine
 | 
					 | 
				
			||||||
RUN echo "Hello world"
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```hcl
 | 
					 | 
				
			||||||
# docker-bake.hcl
 | 
					 | 
				
			||||||
target "app" {
 | 
					 | 
				
			||||||
    contexts = {
 | 
					 | 
				
			||||||
        alpine = "docker-image://alpine:3.13"
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### Using a secondary source directory
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```Dockerfile
 | 
					 | 
				
			||||||
# Dockerfile
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
FROM scratch AS src
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
FROM golang
 | 
					 | 
				
			||||||
COPY --from=src . .
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```hcl
 | 
					 | 
				
			||||||
# docker-bake.hcl
 | 
					 | 
				
			||||||
target "app" {
 | 
					 | 
				
			||||||
    contexts = {
 | 
					 | 
				
			||||||
        src = "../path/to/source"
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### Using a result of one target as a base image in another target
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
To use a result of one target as a build context of another, specity the target name with `target:` prefix.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```Dockerfile
 | 
					 | 
				
			||||||
# Dockerfile
 | 
					 | 
				
			||||||
FROM baseapp
 | 
					 | 
				
			||||||
RUN echo "Hello world"
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```hcl
 | 
					 | 
				
			||||||
# docker-bake.hcl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
target "base" {
 | 
					 | 
				
			||||||
    dockerfile = "baseapp.Dockerfile"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
target "app" {
 | 
					 | 
				
			||||||
    contexts = {
 | 
					 | 
				
			||||||
        baseapp = "target:base"
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Please note that in most cases you should just use a single multi-stage Dockerfile with multiple targets for similar behavior. This case is recommended when you have multiple Dockerfiles that can't be easily merged into one.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Extension field with Compose
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[Special extension](https://github.com/compose-spec/compose-spec/blob/master/spec.md#extension)
 | 
					 | 
				
			||||||
field `x-bake` can be used in your compose file to evaluate fields that are not
 | 
					 | 
				
			||||||
(yet) available in the [build definition](https://github.com/compose-spec/compose-spec/blob/master/build.md#build-definition).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```yaml
 | 
					 | 
				
			||||||
# 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
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```console
 | 
					 | 
				
			||||||
$ 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`:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
`tags`, `cache-from`, `cache-to`, `secret`, `ssh`, `platforms`, `output`,
 | 
					 | 
				
			||||||
`pull`, `no-cache`, `no-cache-filter`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Built-in variables
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* `BAKE_CMD_CONTEXT` can be used to access the main `context` for bake command
 | 
					 | 
				
			||||||
from a bake file that has been [imported remotely](#file).
 | 
					 | 
				
			||||||
* `BAKE_LOCAL_PLATFORM` returns the current platform's default platform
 | 
					 | 
				
			||||||
specification (e.g. `linux/amd64`).
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user