====== Gitlab CI MultiPlatform Build ======
===== Enable binary formats =====
$ docker run --rm --privileged tonistiigi/binfmt --install all
{
"supported": [
"linux/amd64",
"linux/arm64",
"linux/riscv64",
"linux/ppc64le",
"linux/s390x",
"linux/386",
"linux/arm/v7",
"linux/arm/v6"
],
"emulators": [
"qemu-aarch64",
"qemu-arm",
"qemu-ppc64le",
"qemu-riscv64",
"qemu-s390x"
]
}
===== Create buildx enabled docker image for builds =====
ARG BUILDX_VERSION=0.4.2
ARG DOCKER_VERSION=latest
FROM alpine AS fetcher
RUN apk add curl
ARG BUILDX_VERSION
RUN curl -L \
--output /docker-buildx \
"https://github.com/docker/buildx/releases/download/v${BUILDX_VERSION}/buildx-v${BUILDX_VERSION}.linux-amd64"
RUN chmod a+x /docker-buildx
ARG DOCKER_VERSION
FROM docker:${DOCKER_VERSION}
COPY --from=fetcher /docker-buildx /usr/lib/docker/cli-plugins/docker-buildx
Credits to [[https://github.com/jdrouet|Jérémie Drouet]]
==== Build & push image ====
$ docker build --pull -t registry/docker-with-buildx .
$ docker push registry/docker-with-buildx
===== Switch to buildx in .gitlab-ci.yml =====
Define CI_PLATFORMS variable in Settings / CI/CD:
CI_PLATFORMS = linux/amd64,linux/arm/v7,...
image: registry/docker-with-buildx
services:
- docker:dind
build:
stage: build
script:
- docker login -u $CI_USER -p $CI_TOKEN $CI_REGISTRY
- docker buildx create --use
- docker buildx build --platform $CI_PLATFORMS --push --pull -t $CI_REGISTRY_IMAGE .
{{tag>kb git}}