# 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 # ============================================================================= # Étape base — image VectorChord, paquets mis à niveau # ============================================================================= FROM tensorchord/vchord-postgres:pg${PG_VERSION}-v${VCHORD_VERSION} AS base USER root # 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="$(dpkg-query -W -f='${Version}' postgresql-$PG_MAJOR)" \ && rm -rf /var/lib/apt/lists/* # TimescaleDB compilé depuis l'étiquette de la version stable. # TimescaleDB 2.29 a abandonné PostgreSQL 15, qui garde la dernière version qui le gère. ARG TIMESCALEDB_VERSION=2.30.2 ARG TIMESCALEDB_VERSION_PG15=2.28.3 WORKDIR /build/timescaledb RUN if [ "$PG_MAJOR" = 15 ]; then version="$TIMESCALEDB_VERSION_PG15"; else version="$TIMESCALEDB_VERSION"; fi \ && git clone --branch "$version" --depth 1 https://github.com/timescale/timescaledb.git . \ && ./bootstrap -DREGRESS_CHECKS=OFF -DWARNINGS_AS_ERRORS=OFF \ && cd build && make -j$(nproc) && make install DESTDIR=/tmp/timescaledb # ============================================================================= # Étape finale — image publiée, sans outils de compilation # ============================================================================= FROM base AS final # 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" # 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}" # 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/ # 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/* # 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 # 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 # 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_USER:-postgres}" -d "${POSTGRES_DB:-${POSTGRES_USER:-postgres}}" || exit 1 # 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"]