PG18 de retour, mises à jour nocturnes, tests de reprise et documentation
🚀 Docker Build and Push / build-and-push (15) (push) Successful in 5m29s
🚀 Docker Build and Push / build-and-push (16) (push) Successful in 6m10s
🚀 Docker Build and Push / build-and-push (17) (push) Successful in 5m20s
🚀 Docker Build and Push / build-and-push (18) (push) Successful in 5m21s

Image
- Étape `base` commune : tous les paquets sont mis à niveau (PostgreSQL à la
  dernière mineure, pgvector, Debian). L'image de base de VectorChord restait
  figée à la version de sa publication.
- En-têtes du serveur épinglés sur la version du serveur installé. PG18 avait
  été retiré parce que TimescaleDB, compilé avec des en-têtes 18.6, était chargé
  par un serveur 18.3 (`undefined symbol: palloc0_mul`).
- Sonde de santé avec l'utilisateur et la base du conteneur : en `postgres`,
  elle écrivait une erreur FATAL au journal dès que POSTGRES_USER était défini.
- Label `base.name` corrigé : il reprenait la version du paquet au lieu de la
  version majeure.

CI
- PG18 ajouté à la matrice.
- Exécution nocturne : apt est interrogé dans l'image publiée ; elle n'est
  reconstruite et republiée que s'il lui reste des mises à jour, sinon elle est
  seulement testée. Lancement manuel possible.
- `docker-build.yml` supprimé : l'ancien workflow à actions externes tournait
  encore à chaque push, en double de `docker.yml`.
- `paths-ignore` : un push de documentation seule ne lance pas la CI.
- Labels `version`, `url` et `fr.killinger.apt-refresh`.

Tests
- `tests.sh`, la même commande en local et en CI : utilisateur et base autres
  que `postgres`, version majeure du serveur, présence des cinq extensions,
  redémarrage, et reprise d'une base créée par l'image publiée.

Documentation
- README en vitrine, CLAUDE.md, docs/architecture.md,
  docs/exploitation/publication.md, six décisions, docs/a-faire.md.
This commit is contained in:
maxime.killinger committed 2026-10-02 17:55:42 +02:00
1 parent 2a0f84e81a
commit 7de55c5655
18 files changed
+956 -242

No files matched your search

+42 -18
View File
@@ -1,24 +1,43 @@
# syntax=docker/dockerfile:1
# Versions épinglées : docs/decisions/0003-versions-de-timescaledb-et-vectorchord-epinglees.md
ARG PG_VERSION=18
ARG VCHORD_VERSION=1.1.1
# =============================================================================
# Builder stage - Compile TimescaleDB
# Étape base — image VectorChord, paquets mis à niveau
# =============================================================================
FROM tensorchord/vchord-postgres:pg${PG_VERSION}-v1.1.1 AS builder
FROM tensorchord/vchord-postgres:pg${PG_VERSION}-v${VCHORD_VERSION} AS base
USER root
# Install build dependencies
# L'image de base n'est republiée qu'à chaque version de VectorChord : les versions mineures
# de PostgreSQL, pgvector et les correctifs Debian viennent d'apt.
# APT_REFRESH est une clé de cache : la changer rejoue cette couche, ce que fait la CI quand
# des mises à jour sont en attente. Voir docs/decisions/0002-paquets-a-jour-et-en-tetes-du-serveur.md.
ARG APT_REFRESH=
RUN echo "apt refresh: ${APT_REFRESH:-none}" \
&& apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --with-new-pkgs \
&& rm -rf /var/lib/apt/lists/*
# =============================================================================
# Étape builder — compilation de TimescaleDB
# =============================================================================
FROM base AS builder
# Les en-têtes du serveur sont épinglés sur la version du serveur installé : des en-têtes plus
# récents font référencer à TimescaleDB des symboles que le serveur n'exporte pas
# (`palloc0_mul` avec PostgreSQL 18).
RUN apt-get update && apt-get install -y --no-install-recommends \
git \
build-essential \
cmake \
libssl-dev \
libkrb5-dev \
postgresql-server-dev-$PG_MAJOR \
postgresql-server-dev-$PG_MAJOR="$(dpkg-query -W -f='${Version}' postgresql-$PG_MAJOR)" \
&& rm -rf /var/lib/apt/lists/*
# Build TimescaleDB from source (stable release)
# TimescaleDB compilé depuis l'étiquette de la version stable
ARG TIMESCALEDB_VERSION=2.28.3
WORKDIR /build/timescaledb
RUN git clone --branch ${TIMESCALEDB_VERSION} --depth 1 https://github.com/timescale/timescaledb.git . \
@@ -26,45 +45,50 @@ RUN git clone --branch ${TIMESCALEDB_VERSION} --depth 1 https://github.com/times
&& cd build && make -j$(nproc) && make install DESTDIR=/tmp/timescaledb
# =============================================================================
# Final stage - Clean runtime image
# Étape finale — image publiée, sans outils de compilation
# =============================================================================
FROM tensorchord/vchord-postgres:pg${PG_VERSION}-v1.1.1 AS final
FROM base AS final
# OCI Labels
# Labels OCI fixes. Ceux qui dépendent de la construction (révision, version, date) sont posés
# par la CI.
LABEL org.opencontainers.image.title="TimescaleDB + VectorChord + pgvector + PostGIS"
LABEL org.opencontainers.image.description="PostgreSQL with TimescaleDB, VectorChord, pgvector, and PostGIS extensions pre-installed"
LABEL org.opencontainers.image.source="https://gitea.killinger.fr/maxime.killinger/postgres-ts-vectors"
LABEL org.opencontainers.image.vendor="Maxime Killinger"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.base.name="tensorchord/vchord-postgres:pg${PG_VERSION}-v1.1.1"
# PG_MAJOR et non PG_VERSION : dans cette étape, PG_VERSION est la variable d'environnement de
# l'image de base (la version complète du paquet), pas l'argument de construction.
ARG VCHORD_VERSION
LABEL org.opencontainers.image.base.name="tensorchord/vchord-postgres:pg${PG_MAJOR}-v${VCHORD_VERSION}"
# Copy TimescaleDB from builder
# TimescaleDB, depuis l'étape de compilation
COPY --from=builder /tmp/timescaledb/usr/lib/postgresql/ /usr/lib/postgresql/
COPY --from=builder /tmp/timescaledb/usr/share/postgresql/ /usr/share/postgresql/
USER root
# Install PostGIS
# PostGIS
RUN apt-get update && apt-get install -y --no-install-recommends \
postgresql-$PG_MAJOR-postgis-3 \
postgresql-$PG_MAJOR-postgis-3-scripts \
postgis \
&& rm -rf /var/lib/apt/lists/*
# Add init script for auto-extension creation
# Création des extensions à l'initialisation de la base
COPY init-extensions.sh /docker-entrypoint-initdb.d/
RUN sed -i 's/\r$//' /docker-entrypoint-initdb.d/init-extensions.sh && \
chmod +x /docker-entrypoint-initdb.d/init-extensions.sh
# Add entrypoint wrapper to fix volume permissions at runtime
# Enveloppe du point d'entrée : droits du volume, puis point d'entrée d'origine
COPY docker-entrypoint-wrapper.sh /usr/local/bin/
RUN sed -i 's/\r$//' /usr/local/bin/docker-entrypoint-wrapper.sh && \
chmod +x /usr/local/bin/docker-entrypoint-wrapper.sh
# Healthcheck
# Sonde avec l'utilisateur et la base du conteneur : sonder en `postgres` écrit
# `FATAL: role "postgres" does not exist` au journal toutes les 30 s dès que POSTGRES_USER
# est défini.
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \
CMD pg_isready -U postgres || exit 1
CMD pg_isready -U "${POSTGRES_USER:-postgres}" -d "${POSTGRES_DB:-${POSTGRES_USER:-postgres}}" || exit 1
# Run as root initially, wrapper will fix permissions then switch to postgres
# Démarre en root : l'enveloppe corrige les droits, le point d'entrée d'origine passe ensuite
# à l'utilisateur postgres.
ENTRYPOINT ["docker-entrypoint-wrapper.sh"]
CMD ["postgres", "-c", "shared_preload_libraries=timescaledb,vchord"]