AWS ECS 执行 /usr/local/bin/docker-entrypoint.sh 时出现 exec 格式错误。

18

我对Docker世界还不太了解,我正在尝试将一个图像(Node.js TypeScript服务)从AWS ECR部署到AWS ECS,但当我在集群中创建服务时,出现此错误,并且任务永远无法运行:

exec /usr/local/bin/docker-entrypoint.sh: exec format error

我的Dockerfile长这样:

FROM node:lts-alpine

WORKDIR /usr/app

COPY package*.json ./
COPY tsconfig*.json ./

RUN yarn install --quiet

RUN yarn global add pm2

COPY . .

RUN yarn build

CMD ["pm2-runtime", "build/src/localServer.js"]

当我构建镜像并运行时,它在我的电脑上运行良好:

(base) MacBook-Pro api % docker run -it -p 3000:3000 api-dev                                    
2022-12-06T15:35:27: PM2 log: Launching in no daemon mode
2022-12-06T15:35:27: PM2 log: App [localServer:0] starting in -fork mode-
2022-12-06T15:35:27: PM2 log: App [localServer:0] online
Connected to my_mongo_db_cluster
  Server ready at: http://localhost:3000/

任务定义正在运行在 Linux/X86_64 上。

有什么建议或提示可以找出问题是什么吗?谢谢!

编辑:当我在我的 Dockerfile 中添加 ENTRYPOINT 时,像这样

# same steps

COPY . .

RUN yarn build

ENTRYPOINT ["pm2-runtime", "build/src/localServer.js"]

它会抛出这个错误 exec /usr/local/bin/pm2-runtime: exec format error。当我将pm2-runtime更改为node时,同样的情况也发生了。

# same steps

COPY . .

RUN yarn build

ENTRYPOINT ["node", "build/src/localServer.js"]

希望它有所帮助。


你是如何创建服务的? - Richard Rublev
1
只需将午餐类型指定为FARGATE并分配我之前创建的任务定义即可。该任务还被创建为app_environment=FARGATE。 - Michal Ružička Ružička
1个回答

58

我发现问题所在。那是我的苹果 M1 芯片出现了不兼容的问题。对于那些遇到同样问题的人,只需要在 Dockerfile 中添加平台--platform=linux/amd64似乎可以解决问题:

FROM --platform=linux/amd64 node:lts-alpine

# more instructions...

我也是,我不得不重新构建并推送镜像,然后它就可以工作了。 - Jeferex
这也解决了我的问题!我也一直在进行故障排除! - Heather92065
1
因为在M1上构建镜像时忽略了平台规范,导致我在许多场合遇到了问题。就像你一样,在我尝试在亚马逊EKS中运行容器时也发现了这个问题。谢谢你的提醒。 - miked
1
这需要一百万个加一。我之前一直在试验其他技术,一直努力弄清楚到底发生了什么。我开始觉得可能是我被错误地部署到Graviton实例上了。这个回答了我所有的问题。 - AfroRick
1
我在研究上浪费了两天,然后尝试了这个方法,居然奏效了!我欠你一杯啤酒! - DaX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接