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

无法创建适用于aarch64的Docker镜像,运行时出现exec格式错误

问题分析与解决方案

问题根源

exec /usr/local/bin/docker-entrypoint.sh: exec format error 错误的核心原因是:
你当前的Dockerfile使用了 FROM --platform=$BUILDPLATFORM,构建阶段会基于构建机器的架构(比如amd64)运行,安装npm、serverless时会下载对应amd64架构的二进制文件。最终生成的arm64镜像中,实际包含的是amd64架构的可执行文件,在aarch64机器上自然无法运行。

同时你提到QEMU构建速度极慢,这是因为QEMU是模拟架构运行,JS相关的二进制编译过程会被大幅拖慢。


解决方案

1. 修复构建命令的语法错误

你的Semaphore构建命令中,换行后的参数缺少反斜杠,会导致命令执行异常。修正后的命令如下:

docker buildx build \
  --platform linux/arm64/v8,linux/amd64,linux/arm/v6,linux/arm/v7 \
  --build-arg NODE_VERSION=$NODE_VERSION \
  --build-arg NPM_VERSION=$NPM_VERSION \
  --build-arg SERVERLESS_VERSION=$SERVERLESS_VERSION \
  --tag $DOCKER_USERNAME/$DOCKER_IMAGE:$SEMAPHORE_GIT_TAG_NAME \
  --tag $DOCKER_USERNAME/$DOCKER_IMAGE:latest \
  --push "."

2. 调整Dockerfile适配多架构(二选一)

方案A:直接基于目标架构构建(弃用BUILDPLATFORM)

移除FROM行的--platform=$BUILDPLATFORM,让buildx自动根据目标平台拉取对应架构的node基础镜像,全程在目标架构环境中构建(如果CI有原生多架构节点则无需QEMU):

ARG NODE_VERSION=20.10.0
FROM node:$NODE_VERSION-alpine3.19
# Set versions from Make, otherwise use default
## NPM
ARG NPM_VERSION=latest
ENV NPM_VERSION $NPM_VERSION
## SERVERLESS
ARG SERVERLESS_VERSION=latest
ENV SERVERLESS_VERSION $SERVERLESS_VERSION
# Update and upgrade
RUN apk update && \
    apk upgrade --available --no-cache && \
    rm -rf /var/cache/apk/*
# Install
RUN npm install -g npm@$NPM_VERSION && npm install -g serverless@$SERVERLESS_VERSION
# Set workdir
WORKDIR /app

方案B:保留BUILDPLATFORM加速构建,强制npm安装目标架构包

如果需要保留BUILDPLATFORM来加快构建阶段速度,可通过指定npm的架构参数,让npm下载对应目标平台的二进制包:

ARG NODE_VERSION=20.10.0
FROM --platform=$BUILDPLATFORM node:$NODE_VERSION-alpine3.19
# Set versions from Make, otherwise use default
## NPM
ARG NPM_VERSION=latest
ENV NPM_VERSION $NPM_VERSION
## SERVERLESS
ARG SERVERLESS_VERSION=latest
ENV SERVERLESS_VERSION $SERVERLESS_VERSION
# Update and upgrade
RUN apk update && \
    apk upgrade --available --no-cache && \
    rm -rf /var/cache/apk/*
# Install with target architecture
ARG TARGETPLATFORM
RUN case ${TARGETPLATFORM} in \
    linux/amd64) ARCH=x64 ;; \
    linux/arm64/v8) ARCH=arm64 ;; \
    linux/arm/v7) ARCH=armv7l ;; \
    linux/arm/v6) ARCH=armv6l ;; \
    esac && \
    npm_config_arch=${ARCH} npm install -g npm@$NPM_VERSION && \
    npm_config_arch=${ARCH} npm install -g serverless@$SERVERLESS_VERSION
# Set workdir
WORKDIR /app

3. 配置Semaphore原生多架构节点(彻底弃用QEMU)

在Semaphore CI中添加aarch64原生runner实例,初始化buildx时创建包含amd64、aarch64原生节点的builder,这样构建不同架构镜像时直接使用原生环境,完全避免QEMU模拟带来的速度问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:05:09