Skip to content

Docker M1 Mac 构建错误:exec format error 解决方案

问题描述

当在 M1 芯片的 Mac 设备上使用 Docker 构建和运行容器时,可能会遇到以下错误:

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

这个错误通常发生在尝试在基于 ARM 架构的 M1 Mac 上运行为 x86 架构构建的 Docker 镜像时。即使添加 #!/bin/bash shebang 行也无法解决这个问题。

根本原因

M1 Mac 使用的是 ARM64 架构,而许多 Docker 镜像(特别是较旧的镜像)是为 x86_64 架构构建的。当 Docker 尝试在 ARM 设备上运行 x86 二进制文件时,就会出现格式错误。

解决方案

方案一:指定平台构建(推荐)

在 Dockerfile 中的 FROM 指令中明确指定目标平台:

dockerfile
# 使用 x86_64 架构
FROM --platform=linux/amd64 node:11.15

或者针对不同的架构需求:

dockerfile
# 针对 x86_64 架构
FROM --platform=linux/x86_64 node:20

# 针对 ARM64 架构(M1/M2 原生支持)
FROM --platform=linux/ARM64 node:20

方案二:构建时指定平台

在构建镜像时通过命令行参数指定平台:

bash
docker build --platform=linux/amd64 -t <image:tag> .

完整的 Dockerfile 修改示例

dockerfile
# 指定平台为 x86_64
FROM --platform=linux/amd64 node:11.15
ENV NODE_VERSION 11.15

# 其余配置保持不变...
WORKDIR ./

RUN wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | apt-key add -
RUN echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/5.0 main" | tee /etc/apt/sources.list.d/mongodb-org-5.0.list
RUN apt-get update
RUN apt-get install -y mongodb

RUN apt-get install nano

COPY package*.json ./

RUN npm install --ignore-scripts sharp
RUN npm install --only=production

COPY . .

RUN mkdir -p /logs/

ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.5.1/wait /wait
RUN chmod +x /wait

EXPOSE 8080

CMD /wait && npm run dockerServer

架构兼容性说明

架构选择建议

  • linux/amd64: 兼容性好,适合大多数现有镜像
  • linux/arm64: 性能更佳,但可能需要重新构建依赖项

注意事项

  1. 指定平台构建可能会稍微增加构建时间
  2. 某些特定架构的优化功能可能无法使用
  3. 确保所有依赖项都支持所选架构

长期解决方案

对于长期项目,建议:

  1. 更新基础镜像到支持多架构的版本
  2. 使用多阶段构建来简化架构兼容性
  3. 定期测试在不同架构上的兼容性

总结

M1 Mac 上的 Docker 构建错误主要是由于架构不匹配导致的。通过在 Dockerfile 中明确指定目标平台 (--platform=linux/amd64),可以轻松解决这个问题。这种方法既简单又有效,能够确保在保持现有配置不变的情况下顺利完成构建和运行。