# 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 | `//:` | `ghcr.io/org/api:a1b2c3d` | | Release | `//:` | `ghcr.io/org/api:1.2.0` | | Local dev | `:latest` | `api:latest` | ## .dockerignore ``` .git .cursor _docs _standalone node_modules **/bin **/obj **/__pycache__ *.md .env* docker-compose*.yml ``` ```