3 min read | by Jordi Prats
Using buildx we can build multi architecture containers, we can use a github action to automatically build it
We are going to configure the action to be triggered when a tag is pushed:
on:
push:
tags:
- '[0-9]+.[0-9]+.[0-9]+'
We are going to need to get the latest tag to be able to properly tag the docker image and to check out the correct version:
- name: Get latest tag
id: vars
run: echo ::set-output name=tag::${GITHUB_REF:10}
- name: Clone repository
uses: actions/checkout@v2
with:
ref: ${{ steps.vars.outputs.tag }}
Then we will have to setup qemu and buildx. We can define a list of platforms we want to use as a comma-separated list:
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
with:
image: tonistiigi/binfmt:latest
platforms: arm64,arm
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
To be able to push the image to DockerHub we will have to login. We will use DOCKERHUB_USERNAME and DOCKERHUB_TOKEN as secrets. To define these secrets we will have to go to the Settings section on the repository and click on the Secrets sub menu.
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
Finally, we are going to build the image for the list of platforms we want and push it to dockerhub using the tag we have pushed to the repository:
- name: Build and push
uses: docker/build-push-action@v2
with:
context: .
platforms: linux/amd64,linux/arm64,linux/arm/v7
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/ranking:${{ steps.vars.outputs.tag }}
The resulting github action would look like follows:
name: build docker image
on:
push:
tags:
- '[0-9]+.[0-9]+.[0-9]+'
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Get latest tag
id: vars
run: echo ::set-output name=tag::${GITHUB_REF:10}
- name: Clone repository
uses: actions/checkout@v2
with:
ref: ${{ steps.vars.outputs.tag }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
with:
image: tonistiigi/binfmt:latest
platforms: arm64,arm
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v2
with:
context: .
platforms: linux/amd64,linux/arm64,linux/arm/v7
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/ranking:${{ steps.vars.outputs.tag }}
You can find an example of this workflow on the repository jordiprats/fastapi-ranking. On the actions tab you'll find the actions executions. You can also check on dockerhub that it is a docker image with multiple architectures
Posted on 28/09/2021