Source: - https://mirailabs.io/blog/multiarch-docker-with-buildx/ - https://docs.docker.com/buildx/working-with-buildx/
Enable buildx
$ export DOCKER_CLI_EXPERIMENTAL=enabled
$ docker buildx version
github.com/docker/buildx v0.3.1-tp-docker 6db68d029599c6710a32aa7adcba8e5a344795a7
Enable binfmt (Linux only)
$ docker run --rm --privileged docker/binfmt:a7996909642ee92942dcd6cff44b9b95f08dad64
$ ls -al /proc/sys/fs/binfmt_misc/
total 0
drwxr-xr-x. 2 root root 0 May 17 19:49 .
dr-xr-xr-x. 1 root root 0 May 17 19:38 ..
-rw-r--r--. 1 root root 0 May 17 19:49 qemu-aarch64
-rw-r--r--. 1 root root 0 May 17 19:49 qemu-arm
-rw-r--r--. 1 root root 0 May 17 19:49 qemu-ppc64le
-rw-r--r--. 1 root root 0 May 17 19:49 qemu-riscv64
-rw-r--r--. 1 root root 0 May 17 19:49 qemu-s390x
--w-------. 1 root root 0 May 17 19:49 register
-rw-r--r--. 1 root root 0 May 17 19:49 status
$ cat /proc/sys/fs/binfmt_misc/qemu-aarch64
enabled
interpreter /usr/bin/qemu-aarch64
flags: OCF
offset 0
magic 7f454c460201010000000000000000000200b7
mask ffffffffffffff00fffffffffffffffffeffff
Create the multi-arch builder
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
default * docker
default default running linux/amd64, linux/386
$ docker buildx create --use --name cross-builder
cross-builder
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
cross-builder * docker-container
cross-builder0 unix:///var/run/docker.sock inactive
default docker
default default running linux/amd64, linux/38
Tests
1) Create a Go file
$ cat hello.go
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Printf("Hello, %s!\n", runtime.GOARCH)
}
2) Create a Dockerfile
FROM golang:alpine AS builder
RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN go build -o hello .
FROM alpine
RUN mkdir /app
WORKDIR /app
COPY --from=builder /app/hello .
CMD ["./hello"]
3) Build using buildx
$ docker buildx build -t hello-multi-arch --platform=linux/arm,linux/arm64,linux/amd64,windows/amd64 .
Set the default builder to buildx
https://docs.docker.com/buildx/working-with-buildx/#set-buildx-as-the-default-builder