Docker composer
Creates and validates Dockerfile and docker-compose.yml files optimized for the detected stack, including multi-stage builds. Invoke when asked to dockerize an application, create a Dockerfile, set up docker-compose, containerize a service, or optimize an existing Docker setup.From its SKILL.md
npx -y skills add VRIL-LABS/skill-jam --skill docker-composerAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
6.3 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it
Docker Composer
Creates optimized, production-ready Dockerfiles and docker-compose configurations for detected application stacks, including multi-stage builds for minimal image sizes, proper layer caching, health checks, and security hardening.
When to Use
- User asks to "dockerize this app", "create a Dockerfile", or "set up docker-compose"
- An existing Dockerfile is inefficient (large image, slow builds, running as root)
- A multi-service application needs a docker-compose setup for local development
- User wants to add a Docker setup for CI or deployment
- User asks for multi-stage builds to separate build and runtime environments
- Container image size or build time needs to be reduced
Process
-
Detect the application stack:
- Check for
package.json(Node.js),requirements.txt/pyproject.toml(Python),go.mod(Go),pom.xml/build.gradle(Java),Gemfile(Ruby),Cargo.toml(Rust) - Note the framework (Express, FastAPI, Spring Boot, etc.)
- Identify if it's a static site, API server, worker process, or full-stack app
- Check for
-
Choose the right base image:
- Prefer official slim/alpine variants:
node:20-slim,python:3.12-slim,golang:1.22-alpine - For final runtime stages, use distroless where possible (
gcr.io/distroless/nodejs20-debian12) - Pin to a specific digest or version tag — never use
latest - Note the trade-offs (alpine uses musl vs. glibc which can affect native modules)
- Prefer official slim/alpine variants:
-
Design the multi-stage build:
- Stage 1 (deps/builder): install all dependencies, run build tools
- Stage 2 (runtime): copy only the compiled artifacts and runtime dependencies
- This keeps the final image free of build tools, source code, and dev dependencies
-
Apply layer caching optimization:
- Copy dependency manifests (
package.json,requirements.txt) BEFORE source code - Run dependency install BEFORE copying application source
- This ensures the expensive install step is cached unless dependencies change
- Copy dependency manifests (
-
Security hardening:
- Create and use a non-root user (UID 1000):
RUN adduser --system appuser && USER appuser - Set
WORKDIRexplicitly - Use
COPY --chown=appuser:appuserto set ownership - Avoid
sudo,apt-get upgrade, or installing unnecessary packages - Set
--no-cacheforapk add/--no-install-recommendsforapt-get - Expose only necessary ports
- Create and use a non-root user (UID 1000):
-
Add health check:
HEALTHCHECK --interval=30s --timeout=5s CMD curl -f http://localhost:${PORT}/health || exit 1 -
For docker-compose:
- Define services, networks, and named volumes
- Map ports and environment variables
- Set
depends_onwithcondition: service_healthyfor database readiness - Include development overrides (
docker-compose.override.yml) for hot reload
-
Generate a
.dockerignoreto excludenode_modules,.git, test files, and local config.
Output Format
# Dockerfile
# ── Stage 1: Dependencies ──────────────────────────────────────────────────────
FROM node:20-slim AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --only=production
# ── Stage 2: Builder ──────────────────────────────────────────────────────────
FROM node:20-slim AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
# ── Stage 3: Runtime ──────────────────────────────────────────────────────────
FROM node:20-slim AS runtime
ENV NODE_ENV=production PORT=3000
WORKDIR /app
RUN addgroup --system appgroup && adduser --system --ingroup appgroup appuser
COPY --from=deps --chown=appuser:appgroup /app/node_modules ./node_modules
COPY --from=builder --chown=appuser:appgroup /app/dist ./dist
COPY --chown=appuser:appgroup package.json ./
USER appuser
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
CMD ["node", "dist/server.js"]
Examples
Example Input
Dockerize a FastAPI Python app. It needs PostgreSQL and Redis.
Dev setup with hot reload. Production build should be minimal.
Example Output (summary)
Files generated:
Dockerfile — multi-stage: python:3.12-slim builder → distroless runtime
docker-compose.yml — services: app, postgres:16, redis:7-alpine
volumes: postgres_data, redis_data
networks: backend (internal), frontend (exposed)
docker-compose.override.yml — mounts ./src as volume, runs uvicorn --reload
.dockerignore — excludes __pycache__, .venv, .git, tests/, *.pyc
docker-compose.yml services:
app:
build: .
ports: ["8000:8000"]
env_file: .env
depends_on:
postgres: { condition: service_healthy }
redis: { condition: service_healthy }
postgres:
image: postgres:16-alpine
healthcheck: pg_isready
volumes: [postgres_data:/var/lib/postgresql/data]
redis:
image: redis:7-alpine
healthcheck: redis-cli ping
Boundaries
- Do NOT include secrets, passwords, or API keys in Dockerfiles or docker-compose.yml — always use environment variables and
.envfiles (which should be in.gitignore). - Do NOT use
latesttag for base images in production Dockerfiles — always pin versions. - Do NOT run container processes as
rootunless absolutely necessary (and flag it clearly if required). - Do NOT use
ADDwith remote URLs — useCOPYfor local files andcurl/wgetin aRUNstep. - Warn if the application has native module dependencies that may be incompatible with Alpine's musl libc.
- Do NOT generate Kubernetes manifests from this skill — recommend the
api-scaffolderor dedicated K8s tooling. - Always generate a
.dockerignorealongside the Dockerfile.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.