AWS Fargate 服务中的“导致执行用户进程:执行格式错误”

我对 AWS 完全陌生,但几个月来我一直在本地运行我的 dockerized 应用程序,没有任何问题。现在我正在尝试通过 AWS ECS/Fargate 部署此应用程序,我的容器因以下 linux 错误而反复停止: standard_init_linux.go:219: exec user process caused: exec format error 。此错误似乎表明 Fargate 中的架构无法识别我正在运行的 Linux 命令之一,但我无法在任何地方找到关于如何找到正在运行的架构或如何追踪导致的特定命令的好答案问题。

这些是我用于前端和后端的 Dockerfile。该项目构建在 MERN 堆栈中,分为前端 (React) 和后端 (MongoDB/Express)

前端:

FROM alpine:3.10

ENV NODE_VERSION 15.9.0

WORKDIR /frontend

COPY package*.json ./

RUN apk add --no-cache nodejs npm

# some packages rely on gyp so we need this
# pulled from https://github.com/nodejs/docker-node/issues/282
RUN apk add --no-cache --virtual .gyp 
        python 
        make 
        g++ 
    && npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

后端:

FROM alpine:3.10

ENV NODE_VERSION 15.9.0

WORKDIR /backend

COPY package*.json ./

RUN apk add --no-cache nodejs npm

# some packages rely on gyp so we need this
# pulled from https://github.com/nodejs/docker-node/issues/282
RUN apk add --no-cache --virtual .gyp 
        python 
        make 
        g++ 
    && npm install --silent
    && apk del .gyp

COPY ./ ./

EXPOSE 8080

CMD ["npm", "start"]

任何帮助将不胜感激!

stack overflow 'exec user process caused: exec format error' in AWS Fargate Service
原文答案
author avatar

接受的答案

我想你已经确定了你的问题。

您正在 Apple 的 M1 芯片上构建图像,这是一种 ARM 架构。 Fargate 可能运行在更常见的 Intel x86-64 架构上。您在 Mac 上本地构建的图像将无法在那里运行。

最简单的解决方案可能是让您的图像在 Docker Hub 中自动构建(或使用 Github Action to build them in Github )。

我没有关于如何构建和部署图像的所有详细信息,因此我可能遗漏了一些细节。


答案:

作者头像

简短回答: docker buildx build --platform=linux/amd64 -t <image-name> .

作者头像

对于任何回到这里的人来说,Docker 现在提供了一个名为 buildx 的实验性多架构构建命令,您可以指定架构并将这些容器一起交付。这解决了我的问题,非常感谢上面的人指出我正确的方向!

作者头像

正如其他答案所提到的,当您使用 ARM 处理器构建 docker 映像并尝试在 Fargate 的 x86 处理器上运行时,可能会发生这种情况。

截至 2021 年 11 月 23 日,Fargate 现在支持 ARM 架构,但找到它可能有点棘手。确保启用“新 ECS 体验”,然后在创建新任务定义时会看到使用 ARM 的选项。

来源: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-arm64.html

作者头像

基于特定架构构建的图像不适用于其他架构。

我尝试在 Mac M1 芯片上构建映像并将其推送到 dockerhub。我正在尝试使用最终失败的 Amazon Linux 工作程序node在 EKC 集群上运行容器。以下是我找到并为我完美工作的解决方案。

烧瓶应用

#!/usr/bin/env python3
from flask import Flask
app = Flask("basicApp")
@app.route("/")
def sayHello():
    return "<h4 style='color:teal'>Hello World!</h4>"
if __name__ == "__main__":
    app.run()

docker文件

FROM python:3.7-alpine

COPY flaskApp/app.py /app.py
RUN chmod 755 /app.py
RUN pip3 install flask

ENTRYPOINT ["python3", "-m", "flask", "run", "--host=0.0.0.0", "-p", "3000"]

Kubernetes 文件

---
apiVersion: v1
kind: Pod
metadata:
  name: flask-app
  labels:
    name: flask-app
spec:
  containers:
  - name: flask-app
    image: vikrampruthvi5/flask-app:1.1
    ports:
      - containerPort: 3000

使用的命令 docker buildx build --platform=linux/amd64 -t vikrampruthvi5/flask-app:1.1 . docker push vikrampruthvi5/flask-app:1.1