# ============================================================================= # feature-container-runtime-contract — local infrastructure override # # Merge with base (and optionally dev): # docker compose -f docker-compose.yml -f docker-compose.local.yml up # # Local intent: # - Wires the app environment to point at the shared `db` service, which lives in # docker-compose.infra.yml and starts only for lanes whose Compose profile names it. # - Declares no depends_on: a depends_on aimed at a profiled service makes every lane that does # not enable that profile fail to render at all, and ordering is the runtime-smoke wrapper's # job — it knows which services a lane actually starts. # - Keeps read-only filesystem and memory limits from the base compose. # - Publishes the DB on the loopback interface only, so a host-side run # (`./gradlew :app-bootstrap:bootRun`, IDE) reaches the same database the # containerised app reaches over the internal `caskeleton-local` network. # ============================================================================= services: app: # Optional, because src/.env is operator input and a fresh clone does not have one. Before this # was marked optional, untracking that file made `docker compose config` fail outright on a # clone — the environment override that exists for convenience became a hard prerequisite for # rendering the stack at all. The tracked contract is src/.env.example; copy it. env_file: - path: ./src/.env required: false # Wire the app to the local Postgres service on the internal network. environment: # Explicit, not inherited. A Compose profile selects services; it says nothing about which # environment the application believes it is in, and the two drifting is how a dev stack ends # up running local's settings. SPRING_PROFILES_ACTIVE: "local" TZ: "UTC" LANG: "C.UTF-8" LC_ALL: "C.UTF-8" # fallback matches env-keys.yaml SSOT default (30s); base compose grace is 40s. APP_SERVER_SHUTDOWN_TIMEOUT: "${APP_SERVER_SHUTDOWN_TIMEOUT:-30s}" APP_SERVER_SHUTDOWN: "graceful" # Database connection — points to the local `db` service below. # Override with your actual DB credentials in a local .env file. APP_DATASOURCE_URL: "jdbc:postgresql://db:5432/${POSTGRES_DB:-ca_skeleton}" APP_DATASOURCE_USERNAME: "${APP_DATASOURCE_USERNAME:-ca_skeleton}" APP_DATASOURCE_PASSWORD: "${APP_DATASOURCE_PASSWORD:-ca_skeleton}" healthcheck: test: - "CMD" - "wget" - "--no-verbose" - "--tries=1" - "--spider" - "http://localhost:8080/api/healthcheck" interval: 5s timeout: 3s start_period: 20s retries: 12 networks: - caskeleton-infra networks: # Defined in docker-compose.infra.yml, where the services that share it live. caskeleton-infra: external: false