我想解决导致我的 Amazon Elastic Container Service (Amazon ECS) 任务失败的“exec format”(可执行格式)错误。
简短描述
当为容器映像运行的任务是针对您的 Amazon Elastic Compute Cloud (Amazon EC2) 实例的不同架构构建时,就会出现此错误。例如,如果您在基于 ARM 的实例上构建容器映像,然后尝试在 x86 实例上运行任务。
**注意:**该任务的停止原因为“Essential container in task exited”(任务中的基本容器已退出),退出代码为 1。
解决方法
要解决此问题,请更改您的 Amazon ECS 任务的架构或为正确的架构重建映像。
更改 ECS 任务的架构
任务的架构由任务定义中的 cpuArchitecture 参数决定。有效值为 x86_64 和 ARM64,默认值为 x86_64。
要更改用于启动任务的架构,请创建任务定义的新修订版,将 cpuArchitecture 参数设置为所需值。如果任务是服务的一部分,则使用修订后的架构更新服务并执行部署以启动新任务。
对于 Fargate 启动类型,AWS 会自动使用正确的架构预调配基础设施来运行任务。如果您使用 EC2 实例或外部实例作为启动类型,则必须管理配置的容量。有关详细信息,请参阅容量管理。
为正确的架构重建映像
使用任务定义中指定的相同架构来重建容器映像。
**注意:**大多数容器映像构建工具默认为主机的架构。
使用 Docker 或 Finch
在编译命令中添加 --platform parameter 以设置目标架构。例如,Docker build --platform linux/arm64 [...] 用于构建 ARM64 的映像。Finch build --plaform linux/amd64 [...] 用于构建 x86/64 架构的映像。
编译命令示例:
docker build -t my-image --platform linux/arm64
有关命令行客户端 Finch 的详细信息,请参阅 Finch 简介: 用于容器开发的开源客户端。
有关如何构建 Docker 映像的详细信息,请参阅 Docker 网站上的构建多平台映像。
AWS CDK
使用 AWS Cloud Development Kit (AWS CDK) ecs.ContainerImage.fromAsset 映像从源目录中的 Docker 文件构建并上传映像。有关详细信息,请参阅映像。
CodeBuild
您还可以使用带有 Docker 映像的 AWS CodeBuild 来配置架构。有关详细信息,请参阅构建环境计算模式和类型。