available for use in your Dockerfile.
In the following example, the `FROM` instruction is pinned to the native
platform of the builder (using the `--platform=$BUILDPLATFORM` option) to
prevent emulation from kicking in. Then the pre-defined `$BUILDPLATFORM` and
`$TARGETPLATFORM` build arguments are interpolated in a `RUN` instruction. In
this case, the values are just printed to stdout with `echo`, but this
illustrates how you would pass them to the compiler for cross-compilation.
```dockerfile
# syntax=docker/dockerfile:1
FROM --platform=$BUILDPLATFORM golang:alpine AS build
ARG TARGETPLATFORM
ARG BUILDPLATFORM
RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log
FROM alpine
COPY --from=build /log /log
```
## Examples
Here are some examples of multi-platform builds:
- [Simple multi-platform build using emulation](#simple-multi-platform-build-using-emulation)
- [Multi-platform Neovim build using Docker Build Cloud](#multi-platform-neovim-build-using-docker-build-cloud)
- [Cross-compiling a Go application](#cross-compiling-a-go-application)
### Simple multi-platform build using emulation
This example demonstrates how to build a simple multi-platform image using
emulation with QEMU. The image contains a single file that prints the
architecture of the container.
Prerequisites:
- Docker Desktop, or Docker Engine with [QEMU installed](#install-qemu-manually)
- containerd image store enabled
Steps:
1. Create an empty directory and navigate to it:
```console
$ mkdir multi-platform
$ cd multi-platform
```
2. Create a simple Dockerfile that prints the architecture of the container:
```dockerfile
# syntax=docker/dockerfile:1
FROM alpine
RUN uname -m > /arch
```
3. Build the image for `linux/amd64` and `linux/arm64`:
```console
$ docker build --platform linux/amd64,linux/arm64 -t multi-platform .
```
4. Run the image and print the architecture:
```console
$ docker run --rm multi-platform cat /arch
```
- If you're running on an x86-64 machine, you should see `x86_64`.
- If you're running on an ARM machine, you should see `aarch64`.
### Multi-platform Neovim build using Docker Build Cloud
This example demonstrates how run a multi-platform build using Docker Build
Cloud to compile and export [Neovim](https://github.com/neovim/neovim) binaries
for the `linux/amd64` and `linux/arm64` platforms.
Docker Build Cloud provides managed multi-node builders that support native
multi-platform builds without the need for emulation, making it much faster to
do CPU-intensive tasks like compilation.
Prerequisites:
- You've [signed up for Docker Build Cloud and created a builder](/manuals/build-cloud/setup.md)
Steps:
1. Create an empty directory and navigate to it:
```console
$ mkdir docker-build-neovim
$ cd docker-build-neovim
```
2. Create a Dockerfile that builds Neovim.
```dockerfile
# syntax=docker/dockerfile:1
FROM debian:bookworm AS build
WORKDIR /work
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
apt-get update && apt-get install -y \
build-essential \
cmake \
curl \
gettext \
ninja-build \
unzip
ADD https://github.com/neovim/neovim.git#stable .
RUN make CMAKE_BUILD_TYPE=RelWithDebInfo
FROM scratch
COPY --from=build /work/build/bin/nvim /
```
3. Build the image for `linux/amd64` and `linux/arm64` using Docker Build Cloud:
```console
$ docker build \
--builder <cloud-builder> \
--platform linux/amd64,linux/arm64 \
--output ./bin .
```
This command builds the image using the cloud builder and exports the
binaries to the `bin` directory.
4. Verify that the binaries are built for both platforms. You should see the
`nvim` binary for both `linux/amd64` and `linux/arm64`.
```console
$ tree ./bin
./bin
├── linux_amd64
│ └── nvim