Node.js › Docker & Containerization for Node.js

What is a Dockerfile, and what are the essential steps in a basic Dockerfile for a Node.js application?

Beginner

Answer

A Dockerfile is a text file with sequential instructions describing how to build a Docker image -- for a Node.js app this typically means: starting from an official Node.js base image, setting a working directory, copying package.json and package-lock.json first and running npm install (before copying the rest of the source code, to leverage Docker's build-layer caching), copying the rest of the application code, exposing the port it listens on, and defining the command to start the application.
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Real-world example A team's Dockerfile copies only package.json and package-lock.json before running npm install, then copies the rest of the source code afterward, so that changing application code alone (without changing dependencies) doesn't invalidate Docker's cached npm-install layer, keeping rebuild times fast during active development.

Common follow-ups: Why does copying package*.json before the rest of the source code specifically improve Docker build caching?;What's the difference between the 'node' and 'node:alpine' base images in terms of size and compatibility tradeoffs?