Dockerfiles define how to build custom container images.
Basic Dockerfile
FROM node:20-slim\n\nWORKDIR /app\n\nCOPY package*.json ./\nRUN npm ci --only=production\n\nCOPY . .\n\nEXPOSE 3000\n\nCMD ["node", "app.js"]Build
docker build -t myapp:latest .Run
docker run -d -p 3000:3000 --name myapp myapp:latestBest Practices
- Use slim/alpine base images
- Copy package files first for better layer caching
- Use
.dockerignoreto exclude node_modules, .git, etc. - Run as non-root user with
USERinstruction - Use multi-stage builds for compiled languages