fix(install): pre-create ~/.continuum/sockets before docker compose up#1481
Merged
Conversation
continuum-core's Dockerfile creates /root/.continuum/sockets at image build time, but docker-compose.yml mounts the host's ~/.continuum onto /root/.continuum at container start. The mount overlays the image's directory tree — the sockets/ subdir created at build is invisible inside the running container. continuum-core then tries to bind its IPC socket at /root/.continuum/sockets/continuum-core.sock, which fails with "IPC server error: No such file or directory (os error 2)" because the parent dir doesn't exist. Symptom: continuum-core never goes healthy → node-server's depends_on (condition: service_healthy) fails → docker compose up exits 1 with "dependency failed to start: container continuum-core-1 is unhealthy". Concrete trace from canary install-smoke for PR #1480 today: 17:40:25 — All 28 modules initialized, tick loops started 17:40:25 — ❌ IPC server error: No such file or directory (os error 2) 17:40:26 — Container Error / Waiting → Healthcheck never passes install.sh exits at "start support services" phase This bug has been silently blocking install-smoke for any docker-stack- touching PR; the previous 25-min cargo-build timeout was masking it because the install never got far enough to discover the socket issue. Now that PR #1480's precheck + canary-default routing makes the run fast, the underlying problem surfaces in 3 minutes with a clear error. Fix: pre-create the host-side directory tree (sockets/, jtag/data/, jtag/logs/) BEFORE compose up. This way the bind mount delivers a populated /root/.continuum to the container and continuum-core can bind its socket on first start. This is install.sh-side, not Dockerfile-side, because the mount is the overlaying layer — image-build mkdirs are hidden by the bind. The canonical fix is to mkdir on the host (which is what gets mounted). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
continuum-core's IPC server crashes at startup with
IPC server error: No such file or directory (os error 2)because the host bind mount (~/.continuum:/root/.continuum) overlays the Dockerfile's image-timemkdir -p /root/.continuum/sockets. install.sh now pre-creates the directory tree on the host BEFOREcompose up, so the mount delivers a populated dir to the container.Trace from canary install-smoke (#1480 today)
The Dockerfile creates
/root/.continuum/socketsat build time:RUN mkdir -p /root/.continuum/sockets /root/.continuum/jtag/data /root/.continuum/jtag/logsBut docker-compose.yml mounts the host directory:
The bind mount overlays the image's dir tree. The build-time
mkdiris shadowed by the host's~/.continuum(which on a fresh install/runner is just the emptymkdir -p $CONTINUUM_DATAinstall.sh already does). continuum-core then fails to bind its socket because the parent dir doesn't exist.Fix
install.sh's existing
mkdir -p "$CONTINUUM_DATA"(line 780) is expanded to also createsockets/,jtag/data/,jtag/logs/— the same set the Dockerfile creates internally. The mount then carries them into the container.Why install.sh-side, not Dockerfile-side
The bind mount is the OVERLAYING layer; whatever the Dockerfile does at image build is hidden inside the container at runtime when a mount covers the same path. The canonical fix is to ensure the host directory tree exists before the mount activates.
Was this masked by something?
Yes — install-smoke runs were hitting the slower silent-downgrade-to-build path (PR #1480 just fixed). The 25-min cargo build timeout was masking this socket-dir failure mode. Now that #1480's precheck + canary-default routing makes the run fast, the underlying bug surfaces with a clear 3-min diagnostic.
Test plan