# Docker

> Docker (Dev + Prod)

- Skill: `bobmatnyc/docker-3` (Agent Skill)
- Install (CLI): `npx skillmds@latest add bobmatnyc/docker-3`
- Raw SKILL.md: https://api.skillmd.com/api/skills/bobmatnyc/docker-3/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: bobmatnyc (https://skillmd.com/u/bobmatnyc)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/bobmatnyc/docker-3

---

# Docker (Dev + Prod)

## Development image (reload)

```dockerfile
FROM python:3.11-slim
WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
```

If reload does not trigger inside containers (common on mounted volumes), set polling:

```yaml
environment:
  - WATCHFILES_FORCE_POLLING=true
```

## Production image (Gunicorn)

```dockerfile
FROM python:3.11-slim
WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .
CMD ["gunicorn", "app.main:app", "-k", "uvicorn.workers.UvicornWorker", "-w", "4", "--bind", "0.0.0.0:8000"]
```

## docker-compose (dev)

```yaml
services:
  api:
    build: .
    ports: ["8000:8000"]
    volumes: ["./:/app"]
    environment:
      - PYTHONUNBUFFERED=1
      - WATCHFILES_FORCE_POLLING=true
    command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
```


