# Multi-stage build for skald. Postgres ships in the same image # until the tool stabilises; to split, swap the runtime base to # debian:bookworm-slim, drop entrypoint.sh, point DATABASE_URL at # an external pg. # # Build context is the workspace root: `docker build -t skald:latest .` FROM rust:1.95-bookworm AS builder WORKDIR /build # Dependency-cache layer: copy manifests + vendored path-dep first, # build stubs, then drop in real sources. clawdforge is a path dep # resolved at workspace load time. COPY Cargo.toml Cargo.lock ./ COPY skald-core/Cargo.toml skald-core/Cargo.toml COPY skald/Cargo.toml skald/Cargo.toml COPY vendor vendor COPY migrations migrations RUN mkdir -p skald-core/src skald/src \ && echo 'pub fn placeholder() {}' > skald-core/src/lib.rs \ && echo 'fn main() {}' > skald/src/main.rs \ && cargo build --release -p skald \ && rm -rf skald-core/src skald/src COPY skald-core skald-core COPY skald skald RUN touch skald-core/src/lib.rs skald/src/main.rs \ && cargo build --release -p skald # ─── runtime ────────────────────────────────────────────────────── FROM pgvector/pgvector:pg17 AS runtime # tini for sane signal handling / zombie reaping under PID 1. RUN apt-get update \ && apt-get install -y --no-install-recommends tini ca-certificates \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /build/target/release/skald /usr/local/bin/skald COPY --from=builder /build/migrations /var/lib/skald/migrations COPY entrypoint.sh /usr/local/bin/skald-entrypoint.sh RUN chmod +x /usr/local/bin/skald-entrypoint.sh ENV RUST_LOG=info \ SKALD_LISTEN=0.0.0.0:7780 \ POSTGRES_USER=skald \ POSTGRES_DB=skald EXPOSE 7780 ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/skald-entrypoint.sh"] CMD ["serve"]