Docker run fails 'return process.dlopen(module, path.toNamespacedPath(filename));'
Matthew C.
—The following error is returned in your terminal when you use the docker run
command to create and run a new container from a Docker image of a JavaScript project:
Error: /app/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid ELF header at Module._extensions..node (node:internal/modules/cjs/loader:1454:18)
This error indicates that Node modules from a JavaScript project in a Windows or macOS environment have been added to a Docker image that is used to create Docker containers that run in a Linux environment.
It is best not to copy Node modules from a JavaScript project to a Docker image. This prevents cross-platform issues that can be caused by specific Node modules that have a host OS-specific or architecture-specific output that doesn’t work in a Linux environment.
Rather install the Node modules directly in the Docker image. You can use the official Node Docker image as a base image for your Node project, as it has Node.js installed.
To stop running and remove the Docker container causing the error, you will need its CONTAINER ID.
Run the list containers command to retrieve the CONTAINER ID:
docker ps
Then, run the stop
command to stop the container:
docker stop <CONTAINER ID>
Run the rm
command to remove the container:
docker rm <CONTAINER ID>
When you rebuild your Docker image, add the following RUN
build command to your Dockerfile
to install your Node modules in your Docker image:
RUN npm install
When you run the docker build
command, you may see that the npm install
step is cached.
=> CACHED [4/5] RUN npm install
Build caching is used to improve build speeds. You will need to disable the caching, so that the correct Linux-compatible bcrypt
Node module is installed. Rerun the docker build
command and include the --no-cache
flag:
docker build --no-cache -t nodedemo:1.0.0 .
Rerunning the docker build
command will generate a new Docker image new ID. You will need to use this new image ID when running the docker run
command.
Find the updated Docker image ID using the Docker Desktop app or by running the following command to list all your Docker images:
docker image ls
If you need to include Node modules from Windows or macOS environments in your Docker image, you can prevent the error by creating a .dockerignore
file to house the Node modules folder:
node_modules
If your Dockerfile
uses the COPY
command to copy your project’s files and folders to your Docker image, the .dockerignore
file will prevent the node modules from being copied to the Docker image when the docker build
command is run.
Note that Node modules copied into a Docker image will overwrite pre-existing Node modules in that Docker image.
Tasty treats for web developers brought to you by Sentry. Get tips and tricks from Wes Bos and Scott Tolinski.
SEE EPISODESConsidered “not bad” by 4 million developers and more than 100,000 organizations worldwide, Sentry provides code-level observability to many of the world’s best-known companies like Disney, Peloton, Cloudflare, Eventbrite, Slack, Supercell, and Rockstar Games. Each month we process billions of exceptions from the most popular products on the internet.
Here’s a quick look at how Sentry handles your personal information (PII).
×We collect PII about people browsing our website, users of the Sentry service, prospective customers, and people who otherwise interact with us.
What if my PII is included in data sent to Sentry by a Sentry customer (e.g., someone using Sentry to monitor their app)? In this case you have to contact the Sentry customer (e.g., the maker of the app). We do not control the data that is sent to us through the Sentry service for the purposes of application monitoring.
Am I included?We may disclose your PII to the following type of recipients:
You may have the following rights related to your PII:
If you have any questions or concerns about your privacy at Sentry, please email us at compliance@sentry.io.
If you are a California resident, see our Supplemental notice.