services: # The local ETL container. Only runs on the `local` backend (compose profile # `local`); on `motherduck` the pipeline runs in the cloud as a Flight instead, # so this service is skipped. `make up` selects the right path by backend. load: build: ./pipeline profiles: ["local"] volumes: - ./data:/data - ./config.yaml:/app/config.yaml:ro # single source of truth environment: - CONFIG_PATH=/app/config.yaml - motherduck_token=${motherduck_token:-} # unused on local; empty is fine # runs once and exits 0 on success — no restart policy. view: build: ./view depends_on: load: condition: service_completed_successfully required: false # on `motherduck` load isn't started volumes: - ./data:/data:ro # read-only: view never writes the DuckDB file - ./config.yaml:/app/config.yaml:ro environment: - CONFIG_PATH=/app/config.yaml - motherduck_token=${motherduck_token:-} # used when backend: motherduck ports: - "8088:8088"