ACTIVATE when integrating a new Docker image, writing docker-compose.yml services, or adding external tools to a Docker stack. ACTIVATE for 'docker-compose', 'Docker image', 'container setup', 'service integration'. Covers: mandatory RTFM checklist before writing any docker-compose line (volumes, ports, env vars, healthchecks, internal architecture), image inspection commands, common anti-patterns that cause silent failures. DO NOT use for: Dockerfile writing, CI/CD pipeline configuration, Kubernetes.
From toolingnpx claudepluginhub fabiensalles/claude-marketplace --plugin toolingThis skill uses the workspace's default tool permissions.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Clinical copy-editor that reviews text for communication issues. Use when user says review for prose or improve the prose
When integrating a third-party Docker image (RAGFlow, Traefik, PostgreSQL, Redis, n8n, etc.), read the official configuration BEFORE writing any docker-compose line.
Docker images are rarely self-contained. They often depend on:
Never assume. Always verify.
Before writing a service in docker-compose.yml:
# Find the project's official docker-compose.yml
# On GitHub: docker/, deploy/, or repo root
Identify:
depends_on with condition: service_healthy?# View EXPOSE ports, CMD, ENTRYPOINT, volumes
docker inspect <image>:<tag>
# View running processes inside the container
docker exec <container> ps aux
# Check actually open ports
docker exec <container> bash -c 'for port in 80 443 8080 3000; do \
(echo >/dev/tcp/localhost/$port) 2>/dev/null && echo "Port $port OPEN" \
|| echo "Port $port closed"; done'
Some images run multiple internal processes (e.g., RAGFlow = nginx + Python API + workers). Key questions:
| Anti-pattern | Consequence |
|---|---|
| Assuming the port without checking | Traefik routes to the wrong service (404) |
| Ignoring config volumes | Service starts with default config ("Welcome to nginx!") |
| Copying an example without reading | Missing files, undefined variables |
| Guessing memory limits | Silent OOM kills |
| Not reading the Dockerfile/entrypoint | Misunderstanding the internal architecture |
The infiniflow/ragflow image requires 3 nginx files mounted as volumes:
volumes:
- ./nginx/ragflow.conf:/etc/nginx/conf.d/ragflow.conf
- ./nginx/proxy.conf:/etc/nginx/proxy.conf
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
Without them, nginx serves its default page instead of the RAGFlow UI. The entry port is 80 (nginx), not 9380 (internal Python API).