Containerize the server: multi-stage build, compose, data volume

The runtime image carries only what serving needs — the Julia runtime, an
already-precompiled depot, exiftool, and optionally github-linguist. The
package registry, git clones, and the Ruby/C toolchain that builds rugged
all stay in earlier stages.

Two things shape the build. Dependencies are instantiated and precompiled in
a layer keyed only on Project.toml/Manifest.toml, so a src/ edit rebuilds in
seconds rather than minutes; a stub src/FileServer.jl satisfies Pkg's
root-package check there. And github-linguist, the one heavy optional
dependency, is behind WITH_LINGUIST: it degrades gracefully (stage 4 keeps
natural-language enrichment and warns), so building it out is a supported
~160MB saving.

All stage directories are pointed under /data via the FS_*_DIR variables so
one volume holds the whole in-flight working set, and data/ is excluded from
the build context.

Claude-Session: https://claude.ai/code/session_01KMNwyqLS3ns6uwWHGDGdAQ
This commit is contained in:
2026-08-07 15:38:33 -04:00
parent 4a22123001
commit 819a4cce7a
3 changed files with 189 additions and 0 deletions

16
.dockerignore Normal file
View File

@@ -0,0 +1,16 @@
# The pipeline working set (17G here) belongs in a volume, not the image.
data/
.git/
test/
# Benchmark / training / calibration harnesses are dev tools, not runtime.
bin/bench.jl
bin/bench_model.jl
bin/bench_stage1.jl
bin/bench_stage2.jl
bin/cluster_calibrate.jl
bin/train.jl
bin/send_dir.sh
Dockerfile
docker-compose.yml
.dockerignore
*.md