'exec user process caused: exec format error' 在 AWS Fargate 服务中

'exec user process caused: exec format error' in AWS Fargate Service

我是 AWS 的新手,但我已经 运行 我的应用程序在本地 dockerized 几个月了,现在没有任何问题。现在我正尝试通过 AWS ECS/Fargate 部署此应用程序,我的容器因此 linux 错误而反复停止:standard_init_linux.go:219: exec user process caused: exec format error。此错误似乎表明 Fargate 中的体系结构无法识别我是 运行 的 Linux 命令之一,但我无法在任何地方找到如何找到 [=28] 体系结构的好答案=] 或如何追踪导致问题的特定命令。

这些是我的前端和后端 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"]

如有任何帮助,我们将不胜感激!

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

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

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

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

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

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

Images build on a particular architecture do not work on other architecture.

我尝试在 Mac M1 芯片上构建镜像并将其推送到 dockerhub。我正在尝试 运行 EKC 集群上的容器与 Amazon Linux 工作节点,但最终失败了。以下是我找到的解决方案,对我来说效果很好。

烧瓶应用程序

#!/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

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

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

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