Mac M1部署Rails项目到Heroku报Exec format错误如何解决?
问题根因
你遇到的Exec format error错误本质是可执行文件架构和运行环境架构不匹配:
- Heroku容器运行环境为linux/amd64架构,而你的Mac M1是arm64架构,构建镜像时相关配置存在疏漏,导致最终打包的镜像内包含arm64架构的二进制文件,在Heroku的amd64环境无法正常运行
- 即使你在build命令加了
--platform linux/amd64参数,也存在三个常见疏漏:- 本地Docker未初始化支持跨架构构建的buildx实例,参数仅打了架构标识标签,实际镜像内容仍是arm64架构
- Dockerfile未指定基础镜像的架构,默认拉取适配M1的arm64版ruby镜像
- Gemfile.lock中缺少x86_64-linux平台的适配信息,bundle install时编译的原生gem扩展为arm64架构
修复步骤
- 执行以下命令初始化支持跨架构构建的buildx实例:
docker buildx create --use
- 给你的Gemfile.lock添加linux amd64平台支持,在项目根目录执行:
bundle lock --add-platform x86_64-linux
- 修改Dockerfile的基础镜像配置,明确指定拉取amd64版本的ruby镜像:
# 把原第一行FROM替换为下面的内容 FROM --platform=linux/amd64 ruby:3.0.2
- 调整构建发布流程,合并构建和推送步骤,避免本地缓存的旧arm架构镜像被误推送:
docker buildx build --platform linux/amd64 -t registry.heroku.com/myweb/web --push . heroku container:release web -a myweb
- 若仍报错,可在构建命令后加
--no-cache参数清除缓存重新构建,同时检查entrypoint.sh的换行符是否为Unix格式的LF,避免Windows格式的CRLF导致执行异常。
注:你本地的docker-compose.yml是开发环境配置,和Heroku部署无关,无需修改。
内容的提问来源于stack exchange,提问作者TamTam
相关产品推荐
相关产品推荐

