Contexts (original) (raw)

Using Bake with additional contexts

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 keycontexts. These values map to the --build-context flag in thebuild command.

Inside the Dockerfile these contexts can be used with the FROM instruction or--from flag.

Supported context values are:

Using a target as a build context

To use a result of one target as a build context of another, specify the target name with target: prefix.

In most cases you should just use a single multi-stage Dockerfile with multiple targets for similar behavior. This case is only recommended when you have multiple Dockerfiles that can't be easily merged into one.

Deduplicate context transfer

As of Buildx version 0.17.0 and later, Bake automatically de-duplicates context transfer for targets that share the same context. In addition to Buildx version 0.17.0, the builder must be running BuildKit version 0.16.0 or later, and the Dockerfile syntax must be docker/dockerfile:1.10 or later.

If you meet these requirements, you don't need to manually de-duplicate context transfer as described in this section.

When you build targets concurrently, using groups, build contexts are loaded independently for each target. If the same context is used by multiple targets in a group, that context is transferred once for each time it's used. This can result in significant impact on build time, depending on your build configuration. For example, say you have a Bake file that defines the following group of targets:

In this case, the context . is transferred twice when you build the default group: once for target1 and once for target2.

If your context is small, and if you are using a local builder, duplicate context transfers may not be a big deal. But if your build context is big, or you have a large number of targets, or you're transferring the context over a network to a remote builder, context transfer becomes a performance bottleneck.

To avoid transferring the same context multiple times, you can define a named context that only loads the context files, and have each target that needs those files reference that named context. For example, the following Bake file defines a named target ctx, which is used by both target1 and target2:

The named context ctx represents a Dockerfile stage, which copies the files from its context (.). Other stages in the Dockerfile can now reference thectx named context and, for example, mount its files with --mount=from=ctx.