Construir imágenes DOCKER multi-plataforma (ARM, X64, etc)

Las imágenes multi-plataforma no son mas que una misma imagen que se puede ejecutar en distintos sistemas operativos y distintas arquitecturas.

Podemos crear imágenes para nuestros contenedores Docker con el sistema operativo LINUX:

Podemos crear imágenes para nuestros contenedores Docker con el sistema operativo WINDOWS:

También podemos crear imágenes para nuestros contenedores Docker con el sistema operativo MACOS, aunque no es muy utilizado:

Como hemos visto, hay muchas plataformas distintas. Incluso aunque ya no se utilicen de forma comercial o estén en desuso podemos crear contenedores para ellas.

Una pregunta usual es sobre si necesito hardware especializado o crear máquinas virtuales solo para estas tareas. La respuesta varia bastante ya que cada día salen nuevas herramientas. Sí que la mayoría de herramientas como Jenkins, GitHub Actions, CircleCI permiten crear agentes en hardware especializado. Luego ejecutamos cada docker build y por último unirlos en el mismo manifiesto. Pero poco a poco deja de ser utilizado ya que requiere gran cantidad de recursos aunque permite gestionar mayor cantidad de aspectos.

Principalmente hay 2 formas para crear imágenes multi-plataforma. La primera forma es la más antigua, se basa en crear varias imágenes y luego unirlas. La segunda forma y más recomendada es utilizar Buildx, una herramienta de Docker que viene al instalar Docker Desktop en Windows y en MacOS y puede instalar en Linux (instrucciones de instalación).

Aunque lo más sencillo es no hacerlo en local, sino utilizar directamente herramientas para construir imágenes automatizadas como GitHub Actions o CircleCI. Ambos tienen una capa gratuita y utilizan su propia nube por lo que no nos consumen recursos.

GitHub Actions multi-arquitectura

Puedes ver más información sobre GitHub Actions en su página oficial. Pero para resumir, es ilimitado en repositorios públicos y limitados a entre 2.000 y 50.000 minutos por mes en repositorios privados. Tienen máquinas tanto Linux, Windows como MacOS.

Solo tenemos que crear un repositorio, privado o público. Podemos subir todo nuestro código en ese repositorio o si tenemos el código en otro repositorio externo podemos configurarlo para que lo descargue desde ahí, así no tenemos que mover todo.

Para crear las imágenes multi-plataforma vamos en nuestro repositorio a la pestaña de ACTIONS. Y pulsamos sobre NEW WORKFLOW. Luego pulsamos sobre Skip this and set up a workflow yourself.

El código del workflow sería algo así (se puede usar como base). Para estar esta base necesitas configurar tu nombre de usuario y contraseña en el repositorio, pestaña SETTINGS y luego SECRETS. Puedes editar: el nombre que va a tener el workflow (name), cuando se va a ejecutar (on), el tipo de máquina que va a utilizar (runs-on), de donde va a coger el código (actions/checkout@v2), instala la herramienta buildx (crazy-max/ghaction-docker-buildx@v1), inicia sesión en DockerHub y por último puedes cambiar las plataformas que vimos al inicio, el nombre de la imagen y versión.

name: Nombre que va a aparecer de nuestro workflow

on:
  push:
    branches: master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Install buildx
        id: buildx
        uses: crazy-max/ghaction-docker-buildx@v1
        with:
          version: latest
      - name: Login to Docker Hub
        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
      - name: Build the image
        run: |
          docker buildx build --push \
            --tag nombre-usuario/nombre-paquete:latest \
            --platform linux/amd64,linux/arm/v7 .

 

El resultado después de guardarlo y que se ejecute es el siguiente en nuestro DockerHub. Y por lo tanto en este ejemplo se puede ejecutar la imagen tanto en cualquier Linux con procesadores de 34 o 64 bits como en ARM con V7 como por ejemplo las Raspberry Pi.

Más información: