# cameleer-runtime-loader Init container that fetches the deployable JAR into a shared volume before the main runtime container starts. The image is consumed by `DockerRuntimeOrchestrator` in the **cameleer-server** repo as a tenant sidecar — see that repo's `.claude/rules/docker-orchestration.md` ("Init-Container Loader Pattern") for the contract. ## Build CI (`.gitea/workflows/ci.yml`, `docker` job, "Build and push runtime-loader image" step) builds and pushes this image on every main / feature-branch push. Manual build for local testing: docker build -t gitea.siegeln.net/cameleer/cameleer-runtime-loader: . docker push gitea.siegeln.net/cameleer/cameleer-runtime-loader: ## Contract (consumed by cameleer-server) - Env: `ARTIFACT_URL` (signed download URL), `ARTIFACT_EXPECTED_SIZE` (bytes). - Volume: writes `/app/jars/app.jar`. - Exit 0 on success; non-zero on fetch/size failure. - Runs as UID 1000 (loader user), drops all caps, read-only rootfs except `/app/jars`. Contract regression coverage lives on the cameleer-server side (`LoaderHardeningIT`); pulls the published `:latest` and asserts exit 0 under the orchestrator's hardening shape. Don't change the env vars, mount path, or exit-code semantics without updating the cameleer-server side in the same change.