Las imágenes docker que se ejecutan en las máquinas de los desarrolladores tiene binarios que están compilados para la arquitectura x86-64 AMD/Intel, pero si se va a hospedar una aplicación en AWS bajo arquitectura Arm64 (indicado porque PROJECT_CPU_ARCH=ARM64
en el archivo project.env
) es necesario asegurarse de utilizar imágenes compatibles con dicha arquitectura. De lo contrario el arranque de la imagen fallará con el mensaje "failed: Exec format error".
Las instrucciones completas para compilar imágenes multi-plataforma se encuentran en la documentación oficial de Docker como "Multi-platform builds", pero en resumen:
- El constructor de imágenes debe soportar imágenes multiplataforma. Una opción es indicar a docker que use containerd para almacenar las imágenes docker:
- Si usas docker directo SIN Docker Desktop, edita el archivo de configuración del daemon de docker para activarlo.
- Si usas docker mediante Docker Desktop, activa la configuración indicada en Docker Desktop.
- Si usas docker directo SIN Docker Desktop, edita el archivo de configuración del daemon de docker para activarlo.
- Asegúrate que QEMU esté instalando y funcionando (ya que se necesitará para emular la arquitectura arm64). Si no lo tienes ya instalado, esto se hace fácilmente bajando la imagen recomendada por Docker que se registra como un ejecutable del sistema:
docker run --privileged --rm tonistiigi/binfmt --install all
- Construye la imagen multiplataforma con docker buildx build:
docker buildx build --file <DOCKERFILE> --platform linux/amd64,linux/arm64 --progress=plain --provenance=false --push --tag 084828560446.dkr.ecr.us-west-2.amazonaws.com/<PROYECTO>:<NOMBRE DE CONTENEDOR>-<VERSIÓN> <
CONTEXTO_DOCKERFILE_DE_BUILD>
Donde:
-
DOCKERFILE
apunta al Dockerfile a construir, por ejemplo:algun_directorio/Dockerfile
-
--platform linux/amd64,linux/arm64
para arm64 (y el de x86-64 que es 'amd64'): -
--provenance=false
: De lo contrario serán rechazadas por el repositorio AWS ECR -
--progress=plain
: que muestre los logs del proceso sin formateo interactivo para facilitar su visualización. -
--tag
: Opcional si quieres taguear la imagen con el nombre final. Consulta Cómo obtener el nombre que deben tener mis imágenes docker para el repositorio del proyecto. -
--push
: Opcional si quieres empujar la imagen enseguida (asegúrate de haberte autentificado ejecutando con el repositorio de imágenes en AWS como se indica en el artículo Cómo autentificarte para empujar imágenes docker al repositorio de imágenes del proyecto). -
CODIGO_PROYECTO
,NOMBRE CONTENEDOR
yVERSIÓN
por ejemplo "dalek-app:httpd-1.0.0" -
CONTEXTO_DOCKERFILE_DE_BUILD
contexto para el Dockerfile (de donde copia archivos, etc)
Por ejemplo, asumiendo que el directorio actual tiene un Dockerfile, el proyecto es "dalek-app" y se está construyendo el contenedor "httpd" para la versión "0.0.0" el comando sería:
docker buildx build --file Dockerfile --platform linux/amd64,linux/arm64 --progress=plain --provenance=false --push --tag 084828560446.dkr.ecr.us-west-2.amazonaws.com/dalek-app:httpd-0.0.0 .
-