Containerizing Node.js Applications

Containers package an application and its runtime dependencies into a reproducible deployment unit. A production Node.js image should use a suitable base image, install only required dependencies, run as a non-root user when practical, and avoid copying secrets into the image.

Container orchestration systems can provide scaling, health checks, rolling deployments, networking, and resource management.

Production-Oriented Dockerfile
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
EXPOSE 3000
CMD ['node', 'server.js']
💡 The image installs production dependencies, copies application code, runs as the non-root node user, and starts the service.
Key Takeaways
  • Do not bake secrets into container images.
  • Use deterministic dependency installation in builds.
  • Containers should be disposable and externally configurable.
Knowledge Check

Where should production secrets normally come from in a containerized application?