pg_orrery/Dockerfile
Ryan Malloy 3915d1784f Rename pg_orbit to pg_orrery
An existing product called PG Orbit (a mobile PostgreSQL client)
creates a naming conflict. pg_orrery — a database orrery built from
Keplerian parameters and SQL instead of brass gears.

Build system: control file, Makefile, Dockerfile, docker init script.
C source: GUC prefix, PG_FUNCTION_INFO_V1 symbol, header guards,
ereport prefixes, comments across ~30 files including vendored SGP4.
SQL: all 5 install/migration scripts, function name pg_orrery_ephemeris_info.
Tests: 9 SQL suites, 8 expected outputs, standalone DE reader test.
Documentation: CLAUDE.md, README.md, DESIGN.md, Starlight site infra,
36 MDX pages, OG renderer, logo SVG, docker-compose, agent threads.

All 13 regression suites pass. Docs site builds (37 pages).
2026-02-17 13:36:22 -07:00

76 lines
3.1 KiB
Docker

ARG PG_MAJOR=17
# ── Stage 1: Compile against PostgreSQL on Ubuntu 22.04 ─────
# Ubuntu Jammy matches TimescaleDB-HA's glibc (2.35).
# Building on Debian Bookworm (glibc 2.36) risks symbol version
# mismatches when the .so loads in TimescaleDB's runtime.
FROM ubuntu:22.04 AS builder
ARG PG_MAJOR
ARG DEBIAN_FRONTEND=noninteractive
# PGDG apt repository (same source TimescaleDB-HA uses)
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates curl gnupg lsb-release && \
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc \
| gpg --dearmor -o /usr/share/keyrings/postgresql.gpg && \
echo "deb [signed-by=/usr/share/keyrings/postgresql.gpg] \
http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" \
> /etc/apt/sources.list.d/pgdg.list && \
apt-get update && apt-get install -y --no-install-recommends \
postgresql-${PG_MAJOR} \
postgresql-server-dev-${PG_MAJOR} \
gcc make && \
rm -rf /var/lib/apt/lists/*
# Copy source tree (submodule content included as regular files)
WORKDIR /build/pg_orrery
COPY . .
ENV PG_CONFIG=/usr/lib/postgresql/${PG_MAJOR}/bin/pg_config
# Build extension
RUN make PG_CONFIG=${PG_CONFIG}
# Install to system location (needed for installcheck)
RUN make PG_CONFIG=${PG_CONFIG} install
# Run all 13 regression test suites against a throwaway cluster
RUN su postgres -c "/usr/lib/postgresql/${PG_MAJOR}/bin/initdb -D /tmp/pgtest" && \
su postgres -c "/usr/lib/postgresql/${PG_MAJOR}/bin/pg_ctl -D /tmp/pgtest -l /tmp/pgtest.log start" && \
su postgres -c "/usr/lib/postgresql/${PG_MAJOR}/bin/createuser -s root" && \
make PG_CONFIG=${PG_CONFIG} installcheck && \
su postgres -c "/usr/lib/postgresql/${PG_MAJOR}/bin/pg_ctl -D /tmp/pgtest stop"
# Capture artifacts under /pg_orrery prefix for the next stage
RUN make PG_CONFIG=${PG_CONFIG} DESTDIR=/pg_orrery install
# ── Stage 2: Minimal artifact (COPY --from target) ──────────
# ~525 KB total: .so + .control + .sql + init script.
# Downstream images (TimescaleDB-HA, vanilla PG) pull from here.
FROM scratch AS artifact
COPY --from=builder /pg_orrery/ /
COPY docker/020_install_pg_orrery.sh /docker-entrypoint-initdb.d/
# ── Stage 3: Standalone dev/test image ───────────────────────
# Ready-to-run PostgreSQL with pg_orrery pre-installed.
# For development, CI, and standalone experiments.
#
# Optional DE ephemeris at runtime (recommended):
# docker run -v /path/to/de440.bin:/var/lib/postgresql/pg_orrery/de440.bin pg_orrery
# Then: ALTER SYSTEM SET pg_orrery.ephemeris_path = '/var/lib/postgresql/pg_orrery/de440.bin';
#
# Or bake into the image (115 MB for DE440, 3.1 GB for DE441):
# Place the DE file in the build context, then:
# docker build --build-arg DE_FILE=de440.bin -t pg_orrery:de440 .
FROM postgres:${PG_MAJOR}-bookworm AS standalone
COPY --from=artifact / /
# Create the pg_orrery data directory for DE ephemeris files
RUN mkdir -p /var/lib/postgresql/pg_orrery && \
chown postgres:postgres /var/lib/postgresql/pg_orrery