I thought I would write a quick post about this issue, as I’ve encountered it several times. Note, this user could be any ID, not just 1000 or 1001, etc. — it all depends on what user has launched your build container from your deployment software.
The issue: When performing a build step with npm in a Docker container, it throws this error on git checkouts:
npm ERR! Error while executing:
npm ERR! /usr/bin/git ls-remote -h -t ssh://[email protected]/repo.git
npm ERR! No user exists for uid 1000
npm ERR! fatal: Could not read from remote repository.
npm ERR! Please make sure you have the correct access rights
npm ERR! and the repository exists.
npm ERR! exited with error code: 128
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2023-05-08T19_50_34_229Z-debug.log
What was equally frustrating was that in testing the same command in the same container locally (instead of inside our deployment tools), it had no issues.
What causes this issue?
The crux of the issue is this: When NPM/node is trying to checkout from git, it uses the permissions of the node_modules or package.json configurations to determine which user should be used to pull git packages.
When you’re mounting the Docker container to your build/deploy tool, the user owning the files there might not exist in your container. And it also might not be the user that you want to be checking out the files either! By default, like it or not, Docker logs you into the container as “root” user.
So to summarize:
- Docker logs you in as root to perform the npm build commands
- The files you’ve mounted into the container might be owned by a user that only exists on the deployment server and not inside the Docker container
- NPM defaults to use the owner of the node_modules files to choose which user it should use to perform git/ssh commands
- This results in the error that the user does not exist
The fix in this case is just to perform a “chown” of the files you’ve mounted from the deployment server prior to running your npm build commands.
For example, given the scenario that I’ve mounted my files to /source on the container, and my build files are now inside /source/frontend:
$ chown -R root:root /source/frontend/; cd /source/frontend && npm run build
You can replace the path and the npm command with whatever your npm build script is for your own environment. The important part is the change of the ownership at the beginning of the command.
Have you had issues with this error in NPM? Have experiences you want to share? Feel free to leave a comment, or contact me.