Skip to main content

Node, NPM, and NPX in Docker

Overview​

During the deployment of a Node.js project within a Jenkins container running inside Docker, we encountered several issues related to the installation and execution of Node.js, NPM, and NPX. This document provides an overview of the challenges faced and a structured approach to resolving them.

Issues Faced​

1. Node.js, NPM, and NPX Not Found in Jenkins Container​

When executing commands like node --version, npm --version, and npx --version inside the Jenkins container, they were not found. This happened because:

  • The default Jenkins image does not include Node.js.
  • The Jenkins container was built without including Node.js and its package manager.

2. Incorrect Node.js Version​

After installing Node.js, the version was outdated (v16.x), while the project required at least v18.x. This led to build failures with messages like:

[ERROR] Minimum Node.js version not met :(
[INFO] You are using Node.js v16.20.2, Requirement: Node.js >=18.0.

3. Port 3004 Not Accessible​

Even after starting the server, the application was not accessible via localhost:3004. Checking running processes showed multiple instances binding to the same port, potentially causing conflicts.

Step-by-Step Solution​

Step 1: Modify the Dockerfile to Include Node.js​

Since the default Jenkins image does not include Node.js, we modified the Dockerfile to install the required Node.js version.

FROM jenkins/jenkins:lts

USER root

# Install Node.js and NPM
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
&& apt-get install -y nodejs \
&& npm install -g npx

USER jenkins

Step 2: Update docker-compose.yml to Use the Custom Image​

We ensured that our docker-compose.yml referenced the custom Dockerfile instead of pulling the default Jenkins image.

version: '3.8'
services:
jenkins:
build:
context: .
dockerfile: Dockerfile
privileged: true
user: root
ports:
- 8083:8080
- 50000:50000
- 3003:3003
- 3004:3004
container_name: jenkins
volumes:
- ./jenkins/:/var/jenkins_home
- ./shared/:/shared

Step 3: Rebuild and Restart the Jenkins Container​

To apply the changes, we rebuilt and restarted the Jenkins container using:

docker compose up --build -d

Step 4: Verify Node.js Installation​

Once the container was running, we accessed it and verified the installations:

docker exec -it jenkins /bin/bash
which node
which npm
which npx

Output:

/usr/bin/node
/usr/bin/npm
/usr/bin/npx

Step 5: Ensure the Correct Node.js Version​

To verify the installed Node.js version:

node --version

Output:

v18.16.0

Step 6: Fix Port 3004 Issue​

To check if the port was already in use, we ran:

lsof -i :3004

If multiple processes were found, we killed them using:

npx kill-port 3004

Then restarted the application:

npm run start -- --host 0.0.0.0 --port 3004 &
info

Note:

  • The & at the end ensures the process runs in the background.
  • If the application still hangs, check for logs or errors preventing it from properly binding to the port.

Conclusion​

By modifying the Dockerfile, ensuring the correct Node.js version, and managing process conflicts on port 3004, we successfully resolved the deployment issues. These steps provide a structured approach for handling similar issues in Dockerized environments running Node.js applications.