将 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 代码。
无法理解它可能出了什么问题。
设置如下:
- 运行 Docker 桌面 Mac (Apple M1)
- 安装了最新的 Heroku、最新的 NPM、最新的 Node
- 使用 VS 代码
- dockerfile 设置:
WORKDIR /app
COPY package.json .
RUN npm install
COPY index.js .
CMD ["node", "index.js"]
- package.json
{
"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,然后它应该可以正常工作。
发布图片时出错
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 代码。 无法理解它可能出了什么问题。
设置如下:
- 运行 Docker 桌面 Mac (Apple M1)
- 安装了最新的 Heroku、最新的 NPM、最新的 Node
- 使用 VS 代码
- dockerfile 设置:
WORKDIR /app
COPY package.json .
RUN npm install
COPY index.js .
CMD ["node", "index.js"]
- package.json
{
"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,然后它应该可以正常工作。