Quiero resolver el error de “exec format” que hace que se produzca un error en mis tareas de Amazon Elastic Container Service (Amazon ECS).
Descripción breve
Este error se produce cuando las tareas ejecutadas para una imagen de contenedor se crean para una arquitectura diferente para las instancias de Amazon Elastic Compute Cloud (Amazon EC2). Por ejemplo, si creaste una imagen de contenedor en una instancia basada en ARM y luego intentaste ejecutar la tarea en una instancia x86.
Nota: La tarea tiene el motivo de detención "Essential container in task exited" y el código de salida 1.
Resolución
Para resolver este problema, cambia la arquitectura de las tareas de Amazon ECS o vuelve a compilar la imagen para la arquitectura correcta.
Cambio de la arquitectura de las tareas de ECS
La arquitectura de una tarea viene determinada por el parámetro cpuArchitecture de la definición de la tarea. Los valores válidos son x86_64 y ARM64 con x86_64 como valor predeterminado.
Para cambiar la arquitectura utilizada para iniciar las tareas, crea una nueva revisión de la definición de la tarea con el parámetro cpuArchitecture establecido en el valor deseado. Si las tareas forman parte de un servicio, utiliza la arquitectura revisada para actualizar el servicio y realizar una implementación para lanzar nuevas tareas.
Para los tipos de lanzamiento de Fargate, AWS aprovisiona automáticamente la infraestructura con la arquitectura correcta para ejecutar la tarea. Si usas instancias de EC2 o instancias externas como tipo de lanzamiento, debes administrar la capacidad de la configuración. Para obtener más información, consulta Administración de la capacidad.
Nueva compilación de la imagen para la arquitectura correcta
Utiliza la misma arquitectura especificada en la definición de la tarea para volver a compilar la imagen de contenedor.
Nota: La mayoría de las herramientas de compilación de imágenes de contenedores utilizan de forma predeterminada la arquitectura de la máquina host.
Uso de Docker o Finch
Añade el parámetro --platform al comando de compilación para establecer la arquitectura de destino. Por ejemplo, el comando de compilación de Docker --platform linux/arm64\ [...] crea una imagen para ARM64. El comando de compilación de Finch --plaform linux/amd64 [...] crea una imagen para la arquitectura x86/64.
Ejemplo de comando de compilación:
docker build -t my-image --platform linux/arm64
Para obtener más información sobre el cliente de línea de comandos Finch, consulta Introducing Finch: An Open Source Client for Container Development (Presentación de Finch: un cliente de código abierto para el desarrollo de contenedores).
Para obtener más información sobre cómo compilar imágenes de Docker, consulta Building multi-platform images (Compilación de imágenes multiplataforma) en el sitio web de Docker.
AWS CDK
Utiliza la imagen ecs.ContainerImage.fromAsset de AWS Cloud Development Kit (AWS CDK) para compilar y cargar una imagen desde un archivo Docker en tu directorio de origen. Para obtener más información, consulta Images (Imágenes).
CodeBuild
También puedes usar AWS CodeBuild con imágenes de Docker para configurar la arquitectura. Para obtener más información, consulta Build environment compute modes and types (Modos y tipos de computación de entornos de compilación).