Symptom: "Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable." Revision never becomes ready.
Cause: one of three: wrong port (hardcoded instead of $PORT), wrong bind address (YOUR_HOST instead of the all-interfaces address), or the app crashed before listening.
Confirm in order:
1. Local repro: `docker run -e PORT=8080 -p 8080:8080 [IMAGE]`, then curl YOUR_HOST:8080. Fails here means it is the image, full stop.
2. Grep your code for the listen call. Is it reading the PORT env var? Is it binding the all-interfaces address? `app.listen(process.env.PORT)` in Node binds all interfaces by default in most frameworks, but explicit 'YOUR_HOST' binds break it.
3. `gcloud run services logs read [SERVICE] --region [R]` - a crash traceback here means fix the crash, not the port.
Fix:
- Read PORT at startup with a sane default for local dev.
- Bind the all-interfaces address explicitly if your framework defaults to YOUR_HOST.
- If startup is slow (model loading, migrations), the container can be killed before it listens: optimize startup or raise CPU so it boots faster.
Not this: "Revision is not ready" WITH a crash log is a crash diagnosis. The PORT error with NO crash log is a listen diagnosis. Check the logs to tell them apart.
Verify: local docker run with PORT set answers curl, then redeploy and watch the revision reach Ready.