将 Node.js Docker 从本地(Apple M1)推送到 Heroku 时,保持 运行 进入相同的部署错误(Exec Format Error)

Keep running into the same deployment error (Exec Format Error) when pushing Node.js Docker from local (Apple M1) to Heroku

发布图片时出错

2021-04-07T06:30:58.443089+00:00 heroku[web.1]: Starting process with command `node index.js`
2021-04-07T06:31:01.899268+00:00 app[web.1]: Error: Exec format error

我回到了只需要 Express 的最简单的 node.js 代码。 无法理解它可能出了什么问题。

设置如下:

WORKDIR /app
COPY package.json .
RUN npm install
COPY index.js .
CMD ["node", "index.js"]
{
  "name": "SigningV2",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}
web: npm start
- PORT: 3000
- USE_NPM_INSTALL: TRUE  (also tried without, same result)

ps:当 运行 heroku local web 时,它有效

好的,找到了可行的解决方案。 Apple M1(再次)打破了这个标准设置:(

我们需要强制 Heroku 兼容正确的平台。 为此,我们将使用 Docker buildx。注意,不要使用 Heroku:container push 因为据我所知,它不支持不同平台的强制。

对我有用的是以下顺序:

# replace signingv2 with your own tag
docker buildx build --platform linux/amd64 -t signingv2 .

# make sure to use the name of your Heroku app
docker tag signingv2 registry.heroku.com/signingv2/web

# use docker push to push it to the Heroku registry
docker push registry.heroku.com/signingv2/web

# then use heroku release to activate
heroku container:release web -a signingv2

希望 Apple M1 的 Docker 很快在多个平台上得到支持。

Jinxvar 解决方案有效。

之后我遇到了不同的问题
"message": "no pg_hba.conf entry for host "xxx", user "xxx", database "xxx", SSL off"

如果您将 Postgres 用于数据库并出现退出错误,请确保将其包含在您的 pg 配置中。

"ssl": true,
"extra": {
  "ssl": { "rejectUnauthorized": false }
},

虽然在生产中这条路线可能对 运行 不安全。当它准备好生产时,将上面的配置更改为

"SSL": {
"ca": process.env.<your-SSL-cert-var>,

}

我稍微修改了@Jinxvar 的解决方案,因为我必须使用 --load 选项才能推送图像。否则,我 运行 docker image ls

时它甚至都没有出现

以下是对我有用的方法:

$ docker buildx build --load --platform linux/amd64 -t registry.heroku.com/app_name/web .

$ docker push registry.heroku.com/app_name/web:latest

在我的例子中,我通过更改 Dockerfile 解决了这个问题。

我将其更新为 linux/amd64:

拉取节点图像
FROM --platform=linux/amd64 node:14.17.0-alpine

重建,推送到 heroku,然后它应该可以正常工作。