Dockerize an application with a production-ready Dockerfile, docker-compose setup, and .dockerignore.
Use this skill when the user asks to dockerize, containerize, or add Docker support to an application.
Detect the runtime — inspect package.json, requirements.txt, go.mod, Cargo.toml, etc. to determine the language and runtime.
Create a multi-stage Dockerfile
For Node.js (example):
FROM node:20-alpine AS base
FROM base AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
FROM base AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=deps /app/node_modules ./node_modules
COPY --from=build /app/.next ./.next
COPY --from=build /app/public ./public
COPY --from=build /app/package.json ./
EXPOSE 3000
CMD ["npm", "start"]
Adapt for the detected framework — adjust the build output directory, entry command, and base image.
Create .dockerignore
node_modules
.next
.git
.env*
*.md
Create docker-compose.yml (if the app has dependencies like a database or Redis):
services:
app:
build: .
ports:
- "3000:3000"
env_file: .env
depends_on:
- db
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: app
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Add npm scripts (optional)
{
"docker:build": "docker build -t myapp .",
"docker:run": "docker compose up"
}
.env files into the image — use env_file or runtime injection..dockerignore that excludes sibling packages not needed by the target app.HEALTHCHECK instruction for production deployments.