Following the previous article where we saw how to build multi arch images using GitHub Actions, we will now show how to do the same thing using another CI. In this article, we’ll show how to use GitLab CI, which is part of the GitLab.
To start building your image with GitLab CI, you will first need to create a .gitlab-ci.yml
file at the root of your repository, commit it and push it.
image: docker:stable
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
services:
- docker:dind
build:
stage: build
script:
- docker version
This should result in a build output that shows the version of the Docker CLI and Engine:
We will now install Docker buildx. Because GitLabCI runs everything in containers and uses any image you want to start this container, we can use one with buildx preinstalled, like the one we used for CircleCI. And as for CircleCI, we need to start a builder instance.
image: jdrouet/docker-with-buildx:stable
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
services:
- docker:dind
build:
stage: build
script:
- docker buildx create --use
- docker buildx build --platform linux/arm/v7,linux/arm64/v8,linux/amd64 --tag your-username/multiarch-example:gitlab .
And that’s it, your image will now be built for both ARM and x86 platforms.
The last step is now to store the image on the Docker Hub. To do so we’ll need an access token from Docker Hub to get write access.
Once you created it, you’ll have to set in your project CI/CD settings in the Variables section.
We can then add DOCKER_USERNAME
and DOCKER_PASSWORD
variables to GitLab CI so that we can login to push our images.
Once this is done, you can add the login step and the --push
option to the buildx command as follows.
build:
stage: build
script:
- docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD"
- docker buildx create --use
- docker buildx build --push --platform linux/arm/v7,linux/arm64/v8,linux/386,linux/amd64 --tag your-username/multiarch-example:gitlab .
And voila, you can now create a multi arch image each time you make a change in your codebase.