Maven + Mac M1 (aarch64) + Fabric8 docker-maven-plugin

0
148

Ya llevamos tiempo con los nuevos Mac con chip M1 (aarch64) en el mercado y la verdad es que tenemos muchísimas aplicaciones ya migradas y las que no funcionan bastante bien con Rosetta (de hecho en lagunas ocasiones funciona hasta mejor 🤯).

Sin embargo todavía hay cosas que no van finas y ese es el caso si usas: Maven + Mac M1 aarch64 + io.fabric8 docker-maven-plugin.

En este tutorial vamos a ver como solucionarlo.

Índice

  1. El problema
  2. La solución: Redireccionar la comunicación a través de socat
  3. Bola extra
  4. Conclusiones
  5. Sobre el autor

1. El problema

Cuando ejecutas Maven verás que da un error similar a:

Este error ocurre porque la librería de bajo nivel que usa Fabric8 para conectar con el socket del Docker daemon todavía no está adaptada a la nueva arquitectura, así que básicamente el problema es que el docker-maven-plugin de Fabric8 no es capaz de encontrar al Docker daemon.

Puedes encontrar más información de este problema en: https://github.com/fabric8io/docker-maven-plugin/issues/1257

Y también en: https://github.com/jnr/jnr-unixsocket/issues/95

Y un poco más en: https://github.com/jnr/jffi/issues/105

Así que seguramente es cuestión de tiempo que acaben dando soporte (si alguien se anima igual les puede echar una mano 😉).

Pero mientras tanto aquí podemos ver una solución (que encontraréis en inglés en los enlaces anteriores).

2. La solución: Redireccionar la comunicación a través de socat

El truco que vamos a hacer es “engañar” a docker-maven-plugin para que haga la comunicación a través de URL en lugar de socket directo. Y para ello vamos usar la utilidad de línea de comandos socat.

socat se define a sí mismo como:

Socat is a command line based utility that establishes two bidirectional byte streams and transfers data between them.

¿Qué quiere decir esto? Que con socat vamos a ser capaces de redireccionar el tráfico entre docker-maven-plugin y el Docker daemon.

Primero tendremos que instalar socat ya que no viene en el sistema operativo:

Ahora tendremos que definir la variable de entorno:

Con esto le estamos diciendo a docker-maven-plugin que en vez de usar el socket use la URL indicada en la variable DOCKER_HOST. Ojo con esta variable porque si la ponéis en los scripts .xxxrc de vuestra shell entonces todos los clientes de Docker van a intentar usar esa URL y esto igual no os interesa, ahí cada uno verá que se adapta mejor al uso que le quiere dar.

Ahora levantamos socat:

Con esto lo que estamos haciendo es que todo el tráfico que vaya a la URL que habíamos definido con DOCKER_HOSTsocat se va a encargar de mandarlo al puerto del Docker dameon, y viceversa (es decir socat establece una comunicación bidireccional).

Este comando lo podemos lanzar en otra pestaña de nuestro terminal o incluso en background añadiendo la clásica “&” al final, aunque a mi esta opción no me gusta mucho ya que no quiero dejar encendido siempre el socat, sino levantarlo o tirarlo en función de cuando lo necesito.

Y con esto estaría todo, ya deberíamos poder lanzar Maven para ejecutar el plugin docker-maven-plugin con normalidad 👌.

3. Bola extra

Simplemente para que tengáis una referencia rápida, os dejo aquí un ejemplo de configuración del pom.xml de Maven con el plugin docker-maven-plugin para, por ejemplo, levantar una base de datos PostgreSQL para ejecutar los tests de integración.

4. Conclusiones

No siempre tenemos el tiempo para esperar a la solución oficial, pero siempre podemos buscarnos las mañas para conseguir un workaround, mas en el mundo Unix donde las opciones son prácticamente infinitas.

5. Sobre el autor

Alejandro Pérez García (@alejandropgarci).

Ingeniero en Informática (especialidad de Ingeniería del Software) y Certified ScrumMaster.

Socio fundador de Autentia Real Business Solutions S.L. – “Soporte a Desarrollo”.

Dejar respuesta

Please enter your comment!
Please enter your name here