Construimos imágenes acoplables con servicios tomcat dentro de nuestro CI de la siguiente manera:
- PLATFORMS: linux/amd64,linux/arm64/v8 - gradle build … # Switch to use different docker driver which supports multiplatform builds - docker buildx create --use - docker buildx build --push --platform=$PLATFORMS -t $image -f infra/Dockerfile .Esto funciona y empuja la imagen que se puede ejecutar fácilmente en plataformas linux/amd64.
Sin embargo, al ejecutar esta imagen en Apple Silicon, falla con:
org.apache.catalina.startup.ContextConfig Failed to detect ServletContainerInitializers for context with name [] service java.net.MalformedURLException: no !/ found in url spec:file:/usr/local/tomcat/lib/tomcat-websocket.jar!/META-INF/services/javax.servlet.ServletContainerInitializerRastreo completo de la pila aquí:https://gist.github.com/knyttl/c8f2c24ac3d94a91911ca08f08eff668
Lo que me sorprende un poco es:
org.apache.catalina.startup.VersionLoggerListener Architecture: amd64 Supongo que la arquitectura debería ser linux/arm64/v8 , entonces, ¿por qué ejecuta la incorrecta?
Al final, abandoné la forma de CI de construir imágenes M1.
En su lugar, he escrito un script bash (que se ejecutará localmente en M1) que extrae la imagen creada por CI y reconstruye una imagen M1 con el contenido de la imagen creada por CI. No es exactamente agradable, pero funciona.