# Containerization Plan Template

Save as `_docs/04_deploy/containerization.md`.

---

```markdown
# [System Name] — Containerization

## Component Dockerfiles

### [Component Name]

| Property | Value |
|----------|-------|
| Base image | [e.g., mcr.microsoft.com/dotnet/aspnet:8.0-alpine] |
| Build image | [e.g., mcr.microsoft.com/dotnet/sdk:8.0-alpine] |
| Stages | [dependency install → build → production] |
| User | [non-root user name] |
| Health check | [endpoint and command] |
| Exposed ports | [port list] |
| Key build args | [if any] |

### [Repeat for each component]

## Docker Compose — Local Development

```yaml
# docker-compose.yml structure
services:
  [component]:
    build: ./[path]
    ports: ["host:container"]
    environment: [reference .env.dev]
    depends_on: [dependencies with health condition]
    healthcheck: [command, interval, timeout, retries]

  db:
    image: [postgres:version-alpine]
    volumes: [named volume]
    environment: [credentials from .env.dev]
    healthcheck: [pg_isready]

volumes:
  [named volumes]

networks:
  [shared network]
```

## Docker Compose — Blackbox Tests

```yaml
# docker-compose.test.yml structure
services:
  [app components under test]

  test-runner:
    build: ./tests/integration
    depends_on: [app components with health condition]
    environment: [test configuration]
    # Exit code determines test pass/fail

  db:
    image: [postgres:version-alpine]
    volumes: [seed data mount]
```

Run: `docker compose -f docker-compose.test.yml up --abort-on-container-exit`

## Image Tagging Strategy

| Context | Tag Format | Example |
|---------|-----------|---------|
| CI build | `<registry>/<project>/<component>:<git-sha>` | `ghcr.io/org/api:a1b2c3d` |
| Release | `<registry>/<project>/<component>:<semver>` | `ghcr.io/org/api:1.2.0` |
| Local dev | `<component>:latest` | `api:latest` |

## .dockerignore

```
.git
.cursor
_docs
_standalone
node_modules
**/bin
**/obj
**/__pycache__
*.md
.env*
docker-compose*.yml
```
```
