Containerizing a Node.js web application often involves separate build and packaging steps. Docker’s multi-stage builds streamline this process into a single, maintainable Dockerfile that produces smaller, more consistent images.Documentation Index
Fetch the complete documentation index at: https://notes.kodekloud.com/llms.txt
Use this file to discover all available pages before exploring further.
1. Local Build and Basic Containerization
First, you might compile your app locally:dist/ folder with your production assets. To serve it via Nginx, you could write:
| Command | Description |
|---|---|
npm run build | Compile source into dist/ |
docker build -t my-app . | Build Docker image |
docker run -d -p 80:80 my-app | Launch container on host port 80 |
Drawbacks of This Approach
| Issue | Impact |
|---|---|
| Environment Drift | Builds may vary across developer machines |
| Manual Packaging | Two-step process: build locally, then containerize |
| CI/CD Complexity | Every pipeline must replicate your local environment exactly |
2. Using a Separate Builder Image
To ensure repeatable builds, move compilation into its own container:- builder image with
dist/ - my-app image ready to serve via Nginx
Manually extracting artifacts involves creating temporary containers and copying files. This adds complexity and slows down CI/CD pipelines.
3. Simplifying with Multi-Stage Builds
Multi-stage builds merge builder and final stages:- builder stage installs dependencies and compiles into
dist/. - final stage pulls only the built assets into a minimal Nginx image.
3.1 Using Numeric Stage References
Instead of names, you can refer to stages by index:Using named stages (e.g.,
AS builder) improves readability in complex Dockerfiles.3.2 Building a Specific Stage
For debugging or CI-cache purposes, target only the build stage:4. Benefits of Multi-Stage Builds
| Benefit | Explanation |
|---|---|
| Smaller Final Image | Excludes build tools and source code |
| Single Dockerfile | Easier maintenance and less duplication |
| Faster CI/CD | Leverages Docker cache across stages |
| Enhanced Security | Only runtime dependencies end up in the final image |
