You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于非AWS基础镜像创建Lambda Docker镜像遇执行格式错误求助

问题描述

需要通过Docker容器创建AWS Lambda函数,因依赖限制必须使用AWS未提供的Python 3.8.6版本,编写了如下Dockerfile:

# Define custom function directory
ARG FUNCTION_DIR="/function"
FROM python:3.8.6 as build-image
# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Copy function code
RUN mkdir -p ${FUNCTION_DIR}
COPY . ${FUNCTION_DIR}
COPY requirements.txt ${FUNCTION_DIR}

# Install the function's dependencies
RUN pip install \
    --target ${FUNCTION_DIR} \
    awslambdaric && \
    pip install -r ${FUNCTION_DIR}/requirements.txt --target ${FUNCTION_DIR}
FROM python:3.8.6
# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}
# Copy in the built dependencies
COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}
# Set runtime interface client as default command for the container runtime
ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
# Pass the name of the function handler as an argument to the runtime
CMD [ "app.handler" ]

部署Lambda时出现以下错误:

Error: fork/exec /usr/local/bin/python: exec format error
Runtime.InvalidEntrypoint

核心需求:使用Python 3.8.6版本构建Lambda容器镜像。

问题原因与解决办法

核心原因

exec format error 几乎都是镜像架构不匹配导致的:

  • 若在ARM64架构机器(如M系列Mac)上构建镜像,默认生成ARM64架构镜像,但AWS Lambda默认运行环境为x86_64(AMD64)架构;反之亦然。Lambda无法执行与自身架构不兼容的二进制文件(此处的python即为不兼容的可执行文件)。

解决步骤

1. 强制指定构建架构为Lambda兼容的架构

Lambda支持x86_64和arm64两种架构,根据你的Lambda配置选择对应架构构建镜像:

方法一:修改Dockerfile的FROM指令

在每个FROM行添加--platform参数,指定目标架构:

# 构建阶段指定架构
FROM --platform=linux/amd64 python:3.8.6 as build-image
# ... 其他构建步骤 ...

# 最终镜像阶段同样指定架构
FROM --platform=linux/amd64 python:3.8.6

若你的Lambda配置为arm64架构,将linux/amd64替换为linux/arm64即可。

方法二:构建镜像时通过命令行指定架构

执行docker build命令时添加--platform参数:

docker build --platform linux/amd64 -t lambda-python386 .

2. 验证镜像架构(可选)

构建完成后,用以下命令确认镜像架构:

docker inspect lambda-python386 | grep -i architecture

输出应显示你指定的架构(如"Architecture": "amd64")。

3. 本地测试镜像(可选)

可以本地运行镜像测试是否能正常启动runtime:

docker run --rm -p 9000:8080 lambda-python386

在另一个终端发送测试请求:

curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

若能正常响应,说明镜像无问题,再部署到Lambda即可。

内容的提问来源于stack exchange,提问作者rehan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:15:14