deploy/compose: install.sh doesn't pull, so a locally cached :latest can run a stale image (supervisor crash loop)
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 88/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- docker, docker-compose, shell
- Domain
- devops, infrastructure, testing
Research direction
Start with install.sh and the existing assertions in tests/install.test.sh, then check the Try it command in deploy/compose/README.md. Verify the compose pull occurs before the stack starts, both on a fresh machine and with a cached image, and run the install test to confirm the ordering and repeat flow.
Written by the indexing model from the issue text.
Description
Summary
install.sh (and the README's "Try it" flow) runs docker compose up -d without pulling first. On any machine that has previously fetched ghcr.io/rossoctl/serverless-harness:latest — even once, days or weeks ago — Compose reuses the cached image instead of checking the registry, because a mutable tag that already exists locally is never re-resolved on up. The stack still comes up "successfully" (every container reports Started), but it's running whatever was cached, silently.
Repro
- At some point in the past, pull or run the trial once, so
ghcr.io/rossoctl/serverless-harness:latestexists locally. - Let
mainget rebuilt and republished (any push throughbuild.yaml). - Re-run the
install.shone-liner fromdeploy/compose/README.md. docker-compose psshowssupervisorcycling ("Up Less than a second").docker-compose logs supervisor:Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'tsx' imported from /app/packages/supervisor/curl http://127.0.0.1:8080/turngetsRecv failure: Connection reset by peer(or hangs), depending on where the container is in its restart loop.
Hit this after #345 merged: the locally cached image was ~2 weeks old and had no /app/packages/supervisor directory at all (predates the package existing), while sandbox-relay — same image, different working dir — happened to still work because tsx and the relay's code were already present in that stale layer set.
Root cause
docker compose up -donly pulls an image when no local image matches the reference. A:latesttag already present is never re-checked against the registry's current digest.install.shhas nopullstep ($COMPOSE pull, orup --pull always), so it inherits this behavior with zero signal to the user — no warning, no version check, nothing. The trial looks like it started cleanly right up until the first/turncall fails.
Fix options
- (a) Add
$COMPOSE pullbefore$COMPOSE up -dininstall.sh(or pass--pull alwaystoup). Simplest; guarantees currentmainon every run, first-time or repeat. - (b) Leave
install.shas-is and just documentdocker compose pullas a manual step for re-runs.
(a) is the one that actually fixes it for a first-time user, who has no way to know their Docker cache is stale — there's nothing to "remember to do."
Acceptance criteria
-
install.shpulls before starting the stack, on both a fresh machine and a re-run with a stale cached image. -
tests/install.test.shasserts the pull happens (and happens beforeup). - Re-running the "Try it" one-liner from the README always gets the current
mainimages without a manualdocker compose pull.
Related: #342 (compose trial), #345.
- Dominant language
- TypeScript
- Stars
- 5
- Forks
- 11
- Avg merge
- 8h 58m
- Merged PRs (30d)
- 154
Getting set up
- Ships a Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from rossoctl/moca
-
Difficulty 2/5 1-3 hours Newbie friendliness 77/100
Maintainers usually reply within 1 day
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 64/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
Maintainers usually reply within 1 day
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
rossoctl/moca#421 · 1 comment ·
Maintainers usually reply within 1 day
Similar issues
-
calcite-ui-icons enhancement impact - p3 - not time sensitive needs triage
Difficulty 2/5 1-3 hours Newbie friendliness 67/100
Esri/calcite-design-system#15467 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
diegosouzapw/OmniRoute#18390 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
-
Difficulty 1/5 1-3 hours Newbie friendliness 86/100
guilhermerodz/input-otp#157 · 1 comment ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
davidjerleke/embla-carousel#1414 ·
Maintainers usually reply within 4 days