supabase-operator/postgres/Dockerfile

178 lines
6.9 KiB
Docker

# syntax=docker/dockerfile:1.13
ARG POSTGRES_MAJOR=17
ARG POSTGRES_MINOR=2
ARG IMAGE_FLAVOR=standard
ARG DISTRO=bookworm
ARG IMAGE_BASE=ghcr.io/cloudnative-pg/postgresql:${POSTGRES_MAJOR}.${POSTGRES_MINOR}-${IMAGE_FLAVOR}-${DISTRO}
FROM ${IMAGE_BASE} AS base
ENV DEBIAN_FRONTEND=noninteractive
ARG POSTGRES_MAJOR
USER root
RUN apt-get update && \
apt-get install --yes --no-install-recommends \
libsodium23 \
postgresql-${POSTGRES_MAJOR}-cron \
postgresql-${POSTGRES_MAJOR}-http \
postgresql-${POSTGRES_MAJOR}-hypopg \
postgresql-${POSTGRES_MAJOR}-pgrouting \
postgresql-${POSTGRES_MAJOR}-pgtap \
postgresql-${POSTGRES_MAJOR}-plpgsql-check \
postgresql-${POSTGRES_MAJOR}-postgis-3 \
postgresql-${POSTGRES_MAJOR}-wal2json \
postgresql-${POSTGRES_MAJOR}-rum \
postgresql-${POSTGRES_MAJOR}-repack \
postgresql-${POSTGRES_MAJOR}-timescaledb && \
rm -rf /var/lib/apt/lists/*
USER 26
FROM ${IMAGE_BASE} AS builder
ARG POSTGRES_MAJOR
ARG PG_SAFEUPDATE_VERSION=1.5
ARG PG_NET_VERSION=v0.9.1
ARG PGSODIUM_VERSION=v3.1.9
ARG PG_HASHIDS_VERSION=v1.2.1
ARG PG_TLE_VERSION=v1.4.0
ARG PG_GRAPHQL_VERSION=v1.5.9
ARG PG_SUPABASE_VAULT_VERSION=v0.3.1
ARG SUPABASE_WRAPPER_VERSION=v0.4.4
ARG INDEX_ADVISOR_VERSION=v0.2.0
ARG PG_JSONSCHEMA_VERSION=v0.3.3
ARG PG_PLAN_FILTER_REVISION=5081a7b
ENV DEBIAN_FRONTEND=noninteractive
USER root
RUN apt-get update && \
apt-get install --yes --no-install-recommends \
curl \
pkg-config \
ca-certificates \
postgresql-server-dev-${POSTGRES_MAJOR} \
libcurl4-openssl-dev \
libsodium-dev \
git \
build-essential \
flex \
libkrb5-dev
RUN curl -sSf https://sh.rustup.rs | sh -s -- -y && \
export PATH="/root/.cargo/bin:$PATH" && \
export "PG${POSTGRES_MAJOR}_PG_CONFIG=/usr/lib/postgresql/${POSTGRES_MAJOR}/bin/pg_config" && \
cargo install cargo-pgrx --version 0.12.6 --locked && \
cargo pgrx init
WORKDIR /postgres/extensions
ENV PATH="/root/.cargo/bin:$PATH"
# Install pgjwt
RUN git clone https://github.com/michelp/pgjwt.git && \
make -C pgjwt && make -C pgjwt install
# Install pg_hashids
RUN git clone --branch ${PG_HASHIDS_VERSION} --depth 1 https://github.com/iCyberon/pg_hashids.git && \
make -C pg_hashids && make -C pg_hashids install
# Install pg-safeupdate
RUN git clone --branch ${PG_SAFEUPDATE_VERSION} --depth 1 https://github.com/eradman/pg-safeupdate.git && \
make -C pg-safeupdate && make -C pg-safeupdate install
# install pg_net
RUN git clone --branch ${PG_NET_VERSION} --depth 1 https://github.com/supabase/pg_net.git && \
make -C pg_net && make -C pg_net install
# install pg_graphql
RUN git clone --branch ${PG_GRAPHQL_VERSION} --depth 1 https://github.com/supabase/pg_graphql.git && \
cd pg_graphql && \
cargo pgrx install --release
# install supabase vault
RUN git clone --branch ${PG_SUPABASE_VAULT_VERSION} --depth 1 https://github.com/supabase/vault.git && \
make -C vault && make -C vault install
# install pg_jsonschema
RUN git clone --branch ${PG_JSONSCHEMA_VERSION} --depth 1 https://github.com/supabase/pg_jsonschema.git && \
cd pg_jsonschema && \
cargo pgrx install --release
# install supabase wrappers
RUN git clone --branch ${SUPABASE_WRAPPER_VERSION} --depth 1 https://github.com/supabase/wrappers.git && \
cd wrappers/wrappers && \
cargo pgrx install --release --features "pg${POSTGRES_MAJOR},all_fdws"
# install index_advisor
RUN git clone --branch ${INDEX_ADVISOR_VERSION} --depth 1 https://github.com/supabase/index_advisor.git && \
make -C index_advisor && make -C index_advisor install
# install pgsodium
RUN git clone --branch ${PGSODIUM_VERSION} --depth 1 https://github.com/michelp/pgsodium.git && \
make -C pgsodium && make -C pgsodium install
# install pg_tle
RUN git clone --branch ${PG_TLE_VERSION} --depth 1 https://github.com/aws/pg_tle.git && \
make -C pg_tle && make -C pg_tle install
# install pg_plan_filter
RUN git clone https://github.com/pgexperts/pg_plan_filter.git && \
git -C pg_plan_filter checkout ${PG_PLAN_FILTER_REVISION} && \
make -C pg_plan_filter && make -C pg_plan_filter install
FROM base AS final
ARG POSTGRES_MAJOR
# Copy all bitcode additions
COPY --from=builder /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/bitcode /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/bitcode
# pgjwt
COPY --from=builder /usr/share/postgresql/${POSTGRES_MAJOR}/extension/pgjwt* /usr/share/postgresql/${POSTGRES_MAJOR}/extension/
# pg-safeupdate
COPY --from=builder /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/safeupdate.so /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/
# pg_hashids
COPY --from=builder /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/pg_hashids.so /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/
COPY --from=builder /usr/share/postgresql/${POSTGRES_MAJOR}/extension/pg_hashids* /usr/share/postgresql/${POSTGRES_MAJOR}/extension/
# pg_net
COPY --from=builder /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/pg_net.so /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/
COPY --from=builder /usr/share/postgresql/${POSTGRES_MAJOR}/extension/pg_net* /usr/share/postgresql/${POSTGRES_MAJOR}/extension/
# pg_graphql
COPY --from=builder /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/pg_graphql.so /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/
COPY --from=builder /usr/share/postgresql/${POSTGRES_MAJOR}/extension/pg_graphql* /usr/share/postgresql/${POSTGRES_MAJOR}/extension/
# supabase vault
COPY --from=builder /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/supabase_vault.so /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/
COPY --from=builder /usr/share/postgresql/${POSTGRES_MAJOR}/extension/supabase_vault* /usr/share/postgresql/${POSTGRES_MAJOR}/extension/
# pg_jsonschema
COPY --from=builder /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/pg_jsonschema.so /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/
COPY --from=builder /usr/share/postgresql/${POSTGRES_MAJOR}/extension/pg_jsonschema* /usr/share/postgresql/${POSTGRES_MAJOR}/extension/
# Supabase wrappers
COPY --from=builder /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/wrappers-*.so /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/
COPY --from=builder /usr/share/postgresql/${POSTGRES_MAJOR}/extension/wrappers* /usr/share/postgresql/${POSTGRES_MAJOR}/extension/
# pgsodium
COPY --from=builder /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/pgsodium.so /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/
COPY --from=builder /usr/share/postgresql/${POSTGRES_MAJOR}/extension/pgsodium* /usr/share/postgresql/${POSTGRES_MAJOR}/extension/
# pg_tle
COPY --from=builder /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/pg_tle.so /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/
COPY --from=builder /usr/share/postgresql/${POSTGRES_MAJOR}/extension/pg_tle* /usr/share/postgresql/${POSTGRES_MAJOR}/extension/
# pg_plan_filter
COPY --from=builder /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/plan_filter.so /usr/lib/postgresql/${POSTGRES_MAJOR}/lib/
# index_advisor
COPY --from=builder /usr/share/postgresql/${POSTGRES_MAJOR}/extension/index_advisor* /usr/share/postgresql/${POSTGRES_MAJOR}/extension/