Without bind mount: edit a file on host -> docker build -> docker run again. With - .:/app the container sees the host file directly; FastAPI/uvicorn with —reload picks up the change in < 1 s. The catch: node_modules and .venv must NOT be bind-mounted (use anonymous volumes) so Linux-built deps aren’t replaced by Mac-built ones.
web: volumes: [.:/app, /app/.venv] — source overrides source, anonymous volume protects deps.
worker: same pattern, ignores healthcheck (no HTTP port).
Streamlit: same source mount + streamlit run --server.runOnSave=true.
Edit file on host -> bind mount path -> uvicorn --reload
Anonymous volumes protect Linux-built deps on Mac
Bind-mount source + anonymous-volume deps is the dev pattern that saves 10 minutes per change.