Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Error I get when releasing image

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

I went back to the most simple node.js code that only requires Express. Can not get my head around it what could be wrong.

Setup is as following:

  • running Docker Desktop on Mac (Apple M1)
  • installed latest Heroku, latest NPM, latest Node
  • working with VS Code
  • dockerfile setup:
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"
  }
}
  • Procfile
web: npm start
  • added two variables online
- PORT: 3000
- USE_NPM_INSTALL: TRUE  (also tried without, same result)

ps: when running heroku local web, it works

like image 722
Jinxvar Avatar asked Nov 18 '25 03:11

Jinxvar


2 Answers

Ok, found a working solution. It's Apple M1 that is breaking this standard setup (again) :(

We need to force the correct platform to be compatible by Heroku. To do this, we are going to use Docker buildx. Note, do not use Heroku:container push because as far as I know, that does not support the forcing of different platforms.

What worked for me is the following sequence:

# 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

Hope that Docker for Apple M1 is supported on several platforms soon.

like image 141
Jinxvar Avatar answered Nov 20 '25 18:11

Jinxvar


In my case I solved the issue by changing the Dockerfile.

I updated it to pull node image for linux/amd64:

FROM --platform=linux/amd64 node:14.17.0-alpine

Rebuild, push to heroku and it should work fine then.

like image 21
Ilya Matsuev Avatar answered Nov 20 '25 17:11

Ilya Matsuev



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!