mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-04 06:29:42 +02:00
fix(docker): detect and refresh stale build-artefact volumes
codeman-node-modules and codeman-dist (docker-compose.yaml) are seeded from the image only while empty, so a rebuilt image's fresh dist/ node_modules sat unused behind old volume content until something cleared it. The in-app self-updater never hit this (it rebuilds INSIDE the running container, into the very volume already in use), but a `docker compose build` triggered from outside it — Start-Codeman.sh, after a manual `git pull` — did: the container came back up looking unchanged, serving stale compiled routes against current source. Start-Codeman.sh now compares the checkout's HEAD commit and package-lock.json hash against a recorded marker (docker-build-source.json) and clears just the affected volume(s) before its own --build when either moved. The in-place self-update path writes that same marker after a successful build, so the two mechanisms agree on what the volumes currently reflect — without it, the next plain Start-Codeman.sh run would see the HEAD self-update just checked out, not recognise it as already accounted for, and wipe the volumes self-update just correctly rebuilt right back to the older baked image. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R9ZSTEenc8soSu9bTi8Xru
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
89e2cb5814
commit
8fe3f34fc5
@@ -59,6 +59,7 @@ unchanged. The container path is a new `SupervisorKind`, not a new updater.
|
||||
| `CODEMAN_RESTART_BY_EXIT=1` | The Compose file's declaration of that policy, so the updater may exit even with no Docker socket. |
|
||||
| Toolchain + devDependencies in the image | Lets `npm install` and `npm run build` run inside the container. |
|
||||
| `docker-env-applied.json` | Fingerprint baseline, written by `Start-Codeman.sh` on every start. |
|
||||
| `docker-build-source.json` | What HEAD/`package-lock.json` the build artefact volumes currently reflect. Written by both `Start-Codeman.sh` and this in-place update, so the two agree on whether those volumes are stale. |
|
||||
|
||||
### Why build artefacts are in named volumes
|
||||
|
||||
@@ -72,6 +73,20 @@ Docker seeds an empty named volume from the image, so the first start inherits t
|
||||
image's already-built `node_modules` and `dist` and pays no bootstrap cost.
|
||||
`docker compose down -v` is the supported reset: the next start re-seeds them.
|
||||
|
||||
That seeding-only-while-empty behaviour has a second, less obvious edge: it also
|
||||
means a plain `docker compose build` triggered from OUTSIDE the container (for
|
||||
example `Start-Codeman.sh`, after a `git pull` done by hand rather than through
|
||||
this in-app updater) produces a fresh image whose freshly-built `dist`/
|
||||
`node_modules` then sit unused behind the volumes' OLD content — the container
|
||||
comes back up looking unchanged. `Start-Codeman.sh` detects this by comparing the
|
||||
checkout's current HEAD and `package-lock.json` hash against `docker-build-source.json`,
|
||||
and clears just the affected volume(s) before its own `--build` if they moved.
|
||||
This in-place update writes that same file after a successful build precisely so
|
||||
that comparison does not fire on stale information: without it, the next plain
|
||||
`Start-Codeman.sh` run would see the HEAD this update just checked out, not
|
||||
recognise it as already accounted for, and wipe the volumes this update just
|
||||
correctly rebuilt right back to the OLDER image.
|
||||
|
||||
### Why the runtime image carries a build toolchain
|
||||
|
||||
`npm run build` is `tsc` plus `esbuild`, both devDependencies, so the image no
|
||||
|
||||
Reference in New Issue
Block a user