From 6c280979110bfa7e1a2ba0284e6d82f45533e9e5 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 11 Jan 2026 12:58:47 +0000 Subject: [PATCH 1/9] Add pg_lake extension for Iceberg and data lake access - Add pg_lake extension from Snowflake Labs to the Docker image - Build pg_lake with all core extensions (pg_map, pg_extension_base, pg_extension_updater, pg_lake_engine, pg_lake_copy, pg_lake_iceberg, pg_lake_table, pg_lake) - Build and include Apache Avro library required by pg_lake - Add runtime dependencies for pg_lake (snappy, jansson, lz4, xz, zstd, libpq) - Update README to document pg_lake extension - Update Makefile test to verify pg_lake extension loads correctly Note: DuckDB/pgduck_server integration is not included due to Alpine Linux compatibility constraints. The core pg_lake extensions provide Iceberg table support and data lake file access capabilities. --- Dockerfile | 49 +++++++++++++++++++++++++++++++++++++++++++++---- Makefile | 1 + README.md | 2 ++ 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index d53bb38..8352f0b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -# Lean PostgreSQL image with pgvector, PostGIS, pg_textsearch, and pgsodium +# Lean PostgreSQL image with pgvector, PostGIS, pg_textsearch, pgsodium, and pg_lake # Multi-stage build - all toolchains discarded, only artifacts kept ARG PG_VERSION=17 @@ -6,6 +6,7 @@ ARG PGVECTOR_VERSION=0.8.0 ARG POSTGIS_VERSION=3.5.1 ARG PG_TEXTSEARCH_VERSION=0.2.0 ARG PGSODIUM_VERSION=3.1.9 +ARG PG_LAKE_VERSION=main ############################################# # Stage 1: Build extensions @@ -16,6 +17,7 @@ ARG PGVECTOR_VERSION ARG POSTGIS_VERSION ARG PG_TEXTSEARCH_VERSION ARG PGSODIUM_VERSION +ARG PG_LAKE_VERSION RUN apk add --no-cache \ git \ @@ -36,7 +38,18 @@ RUN apk add --no-cache \ # PostGIS build tools perl \ flex \ - bison + bison \ + # pg_lake dependencies + cmake \ + ninja \ + openssl-dev \ + snappy-dev \ + jansson-dev \ + lz4-dev \ + xz-dev \ + zstd-dev \ + libpq-dev \ + linux-headers WORKDIR /build @@ -70,6 +83,25 @@ RUN git clone --branch v${PGSODIUM_VERSION} --depth 1 https://github.com/michelp make -j$(nproc) && \ make install +# pg_lake - Postgres with Iceberg and data lake access +RUN git clone --branch ${PG_LAKE_VERSION} --depth 1 --recurse-submodules https://github.com/Snowflake-Labs/pg_lake.git && \ + cd pg_lake && \ + # Build and install avro library + cd avro && git checkout -f . && git apply --ignore-whitespace ../avro.patch && \ + mkdir -p lang/c/build && cd lang/c/build && \ + cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=RelWithDebInfo && \ + make -j$(nproc) && make install && \ + cd /build/pg_lake && \ + # Build pg_lake extensions (without DuckDB/pgduck_server for Alpine compatibility) + make -C pg_map && make -C pg_map install && \ + make -C pg_extension_base && make -C pg_extension_base install && \ + make -C pg_extension_updater && make -C pg_extension_updater install && \ + make -C pg_lake_engine && make -C pg_lake_engine install && \ + make -C pg_lake_copy && make -C pg_lake_copy install && \ + make -C pg_lake_iceberg && make -C pg_lake_iceberg install && \ + make -C pg_lake_table && make -C pg_lake_table install && \ + make -C pg_lake && make -C pg_lake install + ############################################# # Stage 2: Final lean runtime image ############################################# @@ -84,11 +116,20 @@ RUN apk add --no-cache \ protobuf-c \ libxml2 \ pcre2 \ - libsodium + libsodium \ + # pg_lake runtime dependencies + snappy \ + jansson \ + lz4-libs \ + xz-libs \ + zstd-libs \ + libpq # Copy compiled extensions from builder COPY --from=builder /usr/local/lib/postgresql/ /usr/local/lib/postgresql/ COPY --from=builder /usr/local/share/postgresql/ /usr/local/share/postgresql/ +# Copy avro library for pg_lake +COPY --from=builder /usr/local/lib/libavro* /usr/local/lib/ LABEL org.opencontainers.image.source="https://github.com/constructive-io/docker" -LABEL org.opencontainers.image.description="PostgreSQL 17 with pgvector, PostGIS, pg_textsearch, and pgsodium" +LABEL org.opencontainers.image.description="PostgreSQL 17 with pgvector, PostGIS, pg_textsearch, pgsodium, and pg_lake" diff --git a/Makefile b/Makefile index 2d36ed8..84da59b 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,7 @@ test: build CREATE EXTENSION postgis; \ CREATE EXTENSION pg_textsearch; \ CREATE EXTENSION pgsodium; \ + CREATE EXTENSION pg_lake; \ SELECT 'all extensions OK';" @docker stop $(CONTAINER_NAME)-test > /dev/null @docker rm $(CONTAINER_NAME)-test > /dev/null diff --git a/README.md b/README.md index 91dd59c..9dde5d5 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Lean PostgreSQL 17 image with essential extensions for modern applications. | [PostGIS](https://postgis.net/) | Spatial and geographic data | | [pg_textsearch](https://www.tigerdata.com/docs/use-timescale/latest/extensions/pg-textsearch) | BM25 full-text search | | [pgsodium](https://github.com/michelp/pgsodium) | Encryption using libsodium | +| [pg_lake](https://github.com/Snowflake-Labs/pg_lake) | Iceberg and data lake access | ## Usage @@ -36,6 +37,7 @@ CREATE EXTENSION vector; CREATE EXTENSION postgis; CREATE EXTENSION pg_textsearch; CREATE EXTENSION pgsodium; +CREATE EXTENSION pg_lake; ``` ## Build From 93f9107343716d89ef386e3b66ba98db857d29e8 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 11 Jan 2026 13:05:46 +0000 Subject: [PATCH 2/9] Fix pg_lake build: add krb5-dev for gssapi headers The pg_lake_engine extension requires gssapi/gssapi.h from the PostgreSQL server headers, which depends on the Kerberos development package. --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 8352f0b..6c4a2d9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -49,7 +49,8 @@ RUN apk add --no-cache \ xz-dev \ zstd-dev \ libpq-dev \ - linux-headers + linux-headers \ + krb5-dev WORKDIR /build From 8909b98401ad6f93ab9bf8ad7585239e686eaa69 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 11 Jan 2026 13:38:29 +0000 Subject: [PATCH 3/9] Add separate postgres-plus-lake image with pg_lake extension - Revert main Dockerfile to original Alpine-based image (postgres-plus) - Add new Dockerfile.pg_lake with Debian base for pg_lake compatibility - Update CI workflow to build both images (postgres-plus and postgres-plus-lake) - Update Makefile with targets for both images (build-lake, test-lake, etc.) - Update README to document both images The pg_lake extension requires PostgreSQL server internal headers that aren't available in Alpine-based images, so it uses a Debian (bookworm) base instead. --- .github/workflows/docker.yml | 200 +++++++++++++++++++++++++++++++---- Dockerfile | 50 +-------- Dockerfile.pg_lake | 140 ++++++++++++++++++++++++ Makefile | 48 ++++++++- README.md | 65 +++++++++--- 5 files changed, 424 insertions(+), 79 deletions(-) create mode 100644 Dockerfile.pg_lake diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 208515f..01f0d8d 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,4 +1,4 @@ -name: Build and Push Docker Image +name: Build and Push Docker Images on: push: @@ -9,14 +9,14 @@ on: env: REGISTRY: ghcr.io - IMAGE_NAME: constructive-io/docker/postgres-plus PG_VERSION: '17' concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-docker-postgres-plus + group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: + # Build postgres-plus (Alpine, lean image without pg_lake) build-postgres-plus: strategy: fail-fast: false @@ -53,7 +53,7 @@ jobs: id: meta uses: docker/metadata-action@v5 with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + images: ${{ env.REGISTRY }}/constructive-io/docker/postgres-plus tags: | type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }} type=raw,value=${{ env.PG_VERSION }},enable=${{ github.ref == 'refs/heads/main' }} @@ -61,20 +61,20 @@ jobs: type=semver,pattern={{version}},enable=${{ startsWith(github.ref, 'refs/tags/v') }} type=semver,pattern={{major}}.{{minor}},enable=${{ startsWith(github.ref, 'refs/tags/v') }} - - name: Build (no push, PR only, amd64) - if: github.event_name == 'pull_request' && matrix.platform == 'linux/amd64' + - name: Build (PR only) + if: github.event_name == 'pull_request' uses: docker/build-push-action@v6 with: context: . file: ./Dockerfile - platforms: linux/amd64 + platforms: ${{ matrix.platform }} push: false tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} build-args: | PG_VERSION=${{ env.PG_VERSION }} - cache-from: type=gha - cache-to: type=gha,mode=max + cache-from: type=gha,scope=postgres-plus-${{ matrix.arch }} + cache-to: type=gha,mode=max,scope=postgres-plus-${{ matrix.arch }} - name: Build & push by digest if: github.event_name != 'pull_request' @@ -85,26 +85,116 @@ jobs: file: ./Dockerfile platforms: ${{ matrix.platform }} labels: ${{ steps.meta.outputs.labels }} - outputs: type=image,name=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }},push-by-digest=true,push=true + outputs: type=image,name=${{ env.REGISTRY }}/constructive-io/docker/postgres-plus,push-by-digest=true,push=true + build-args: | + PG_VERSION=${{ env.PG_VERSION }} + cache-from: type=gha,scope=postgres-plus-${{ matrix.arch }} + cache-to: type=gha,mode=max,scope=postgres-plus-${{ matrix.arch }} + + - name: Export digest + if: github.event_name != 'pull_request' + run: | + mkdir -p "${{ runner.temp }}/digests-postgres-plus" + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests-postgres-plus/${digest#sha256:}" + + - name: Upload digest + if: github.event_name != 'pull_request' + uses: actions/upload-artifact@v4 + with: + name: digests-postgres-plus-${{ matrix.arch }} + path: ${{ runner.temp }}/digests-postgres-plus/* + + # Build postgres-plus-lake (Debian, includes pg_lake) + build-postgres-plus-lake: + strategy: + fail-fast: false + matrix: + include: + - platform: linux/amd64 + arch: amd64 + runner: ubuntu-latest + - platform: linux/arm64 + arch: arm64 + runner: ubuntu-24.04-arm + runs-on: ${{ matrix.runner }} + + permissions: + contents: read + packages: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Container Registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/constructive-io/docker/postgres-plus-lake + tags: | + type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }} + type=raw,value=${{ env.PG_VERSION }},enable=${{ github.ref == 'refs/heads/main' }} + type=sha,format=short,prefix= + type=semver,pattern={{version}},enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{major}}.{{minor}},enable=${{ startsWith(github.ref, 'refs/tags/v') }} + + - name: Build (PR only) + if: github.event_name == 'pull_request' + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile.pg_lake + platforms: ${{ matrix.platform }} + push: false + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + build-args: | + PG_VERSION=${{ env.PG_VERSION }} + cache-from: type=gha,scope=postgres-plus-lake-${{ matrix.arch }} + cache-to: type=gha,mode=max,scope=postgres-plus-lake-${{ matrix.arch }} + + - name: Build & push by digest + if: github.event_name != 'pull_request' + id: build + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile.pg_lake + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,name=${{ env.REGISTRY }}/constructive-io/docker/postgres-plus-lake,push-by-digest=true,push=true build-args: | PG_VERSION=${{ env.PG_VERSION }} - cache-from: type=gha - cache-to: type=gha,mode=max + cache-from: type=gha,scope=postgres-plus-lake-${{ matrix.arch }} + cache-to: type=gha,mode=max,scope=postgres-plus-lake-${{ matrix.arch }} - name: Export digest if: github.event_name != 'pull_request' run: | - mkdir -p "${{ runner.temp }}/digests" + mkdir -p "${{ runner.temp }}/digests-postgres-plus-lake" digest="${{ steps.build.outputs.digest }}" - touch "${{ runner.temp }}/digests/${digest#sha256:}" + touch "${{ runner.temp }}/digests-postgres-plus-lake/${digest#sha256:}" - name: Upload digest if: github.event_name != 'pull_request' uses: actions/upload-artifact@v4 with: - name: digests-${{ matrix.arch }} - path: ${{ runner.temp }}/digests/* + name: digests-postgres-plus-lake-${{ matrix.arch }} + path: ${{ runner.temp }}/digests-postgres-plus-lake/* + # Publish postgres-plus manifest publish-postgres-plus-manifest: if: github.event_name != 'pull_request' runs-on: ubuntu-latest @@ -128,7 +218,79 @@ jobs: - name: Download digests uses: actions/download-artifact@v4 with: - pattern: digests-* + pattern: digests-postgres-plus-* + path: ${{ runner.temp }}/digests + merge-multiple: true + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/constructive-io/docker/postgres-plus + tags: | + type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }} + type=raw,value=${{ env.PG_VERSION }},enable=${{ github.ref == 'refs/heads/main' }} + type=sha,format=short,prefix= + type=semver,pattern={{version}},enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{major}}.{{minor}},enable=${{ startsWith(github.ref, 'refs/tags/v') }} + + - name: Create and push multi-arch manifests + run: | + set -euo pipefail + + image="${{ env.REGISTRY }}/constructive-io/docker/postgres-plus" + digest_dir="${{ runner.temp }}/digests" + + if [ ! -d "$digest_dir" ]; then + echo "No digests directory found at $digest_dir" + exit 1 + fi + + digests="" + for digest_file in "$digest_dir"/*; do + digest="$(basename "$digest_file")" + digests="$digests $image@sha256:$digest" + done + + if [ -z "$digests" ]; then + echo "No digests found to create manifest" + exit 1 + fi + + echo "Creating manifests for tags:" + echo "${{ steps.meta.outputs.tags }}" + + echo "${{ steps.meta.outputs.tags }}" | while read -r tag; do + [ -z "$tag" ] && continue + echo "Creating multi-arch manifest for $tag" + docker buildx imagetools create -t "$tag" $digests + done + + # Publish postgres-plus-lake manifest + publish-postgres-plus-lake-manifest: + if: github.event_name != 'pull_request' + runs-on: ubuntu-latest + needs: build-postgres-plus-lake + + permissions: + contents: read + packages: write + + steps: + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Download digests + uses: actions/download-artifact@v4 + with: + pattern: digests-postgres-plus-lake-* path: ${{ runner.temp }}/digests merge-multiple: true @@ -136,7 +298,7 @@ jobs: id: meta uses: docker/metadata-action@v5 with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + images: ${{ env.REGISTRY }}/constructive-io/docker/postgres-plus-lake tags: | type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }} type=raw,value=${{ env.PG_VERSION }},enable=${{ github.ref == 'refs/heads/main' }} @@ -148,7 +310,7 @@ jobs: run: | set -euo pipefail - image="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}" + image="${{ env.REGISTRY }}/constructive-io/docker/postgres-plus-lake" digest_dir="${{ runner.temp }}/digests" if [ ! -d "$digest_dir" ]; then diff --git a/Dockerfile b/Dockerfile index 6c4a2d9..d53bb38 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -# Lean PostgreSQL image with pgvector, PostGIS, pg_textsearch, pgsodium, and pg_lake +# Lean PostgreSQL image with pgvector, PostGIS, pg_textsearch, and pgsodium # Multi-stage build - all toolchains discarded, only artifacts kept ARG PG_VERSION=17 @@ -6,7 +6,6 @@ ARG PGVECTOR_VERSION=0.8.0 ARG POSTGIS_VERSION=3.5.1 ARG PG_TEXTSEARCH_VERSION=0.2.0 ARG PGSODIUM_VERSION=3.1.9 -ARG PG_LAKE_VERSION=main ############################################# # Stage 1: Build extensions @@ -17,7 +16,6 @@ ARG PGVECTOR_VERSION ARG POSTGIS_VERSION ARG PG_TEXTSEARCH_VERSION ARG PGSODIUM_VERSION -ARG PG_LAKE_VERSION RUN apk add --no-cache \ git \ @@ -38,19 +36,7 @@ RUN apk add --no-cache \ # PostGIS build tools perl \ flex \ - bison \ - # pg_lake dependencies - cmake \ - ninja \ - openssl-dev \ - snappy-dev \ - jansson-dev \ - lz4-dev \ - xz-dev \ - zstd-dev \ - libpq-dev \ - linux-headers \ - krb5-dev + bison WORKDIR /build @@ -84,25 +70,6 @@ RUN git clone --branch v${PGSODIUM_VERSION} --depth 1 https://github.com/michelp make -j$(nproc) && \ make install -# pg_lake - Postgres with Iceberg and data lake access -RUN git clone --branch ${PG_LAKE_VERSION} --depth 1 --recurse-submodules https://github.com/Snowflake-Labs/pg_lake.git && \ - cd pg_lake && \ - # Build and install avro library - cd avro && git checkout -f . && git apply --ignore-whitespace ../avro.patch && \ - mkdir -p lang/c/build && cd lang/c/build && \ - cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=RelWithDebInfo && \ - make -j$(nproc) && make install && \ - cd /build/pg_lake && \ - # Build pg_lake extensions (without DuckDB/pgduck_server for Alpine compatibility) - make -C pg_map && make -C pg_map install && \ - make -C pg_extension_base && make -C pg_extension_base install && \ - make -C pg_extension_updater && make -C pg_extension_updater install && \ - make -C pg_lake_engine && make -C pg_lake_engine install && \ - make -C pg_lake_copy && make -C pg_lake_copy install && \ - make -C pg_lake_iceberg && make -C pg_lake_iceberg install && \ - make -C pg_lake_table && make -C pg_lake_table install && \ - make -C pg_lake && make -C pg_lake install - ############################################# # Stage 2: Final lean runtime image ############################################# @@ -117,20 +84,11 @@ RUN apk add --no-cache \ protobuf-c \ libxml2 \ pcre2 \ - libsodium \ - # pg_lake runtime dependencies - snappy \ - jansson \ - lz4-libs \ - xz-libs \ - zstd-libs \ - libpq + libsodium # Copy compiled extensions from builder COPY --from=builder /usr/local/lib/postgresql/ /usr/local/lib/postgresql/ COPY --from=builder /usr/local/share/postgresql/ /usr/local/share/postgresql/ -# Copy avro library for pg_lake -COPY --from=builder /usr/local/lib/libavro* /usr/local/lib/ LABEL org.opencontainers.image.source="https://github.com/constructive-io/docker" -LABEL org.opencontainers.image.description="PostgreSQL 17 with pgvector, PostGIS, pg_textsearch, pgsodium, and pg_lake" +LABEL org.opencontainers.image.description="PostgreSQL 17 with pgvector, PostGIS, pg_textsearch, and pgsodium" diff --git a/Dockerfile.pg_lake b/Dockerfile.pg_lake new file mode 100644 index 0000000..ac2deb7 --- /dev/null +++ b/Dockerfile.pg_lake @@ -0,0 +1,140 @@ +# PostgreSQL image with pgvector, PostGIS, pg_textsearch, pgsodium, and pg_lake +# Uses Debian base for pg_lake compatibility (requires full PostgreSQL server headers) +# Multi-stage build - all toolchains discarded, only artifacts kept + +ARG PG_VERSION=17 +ARG PGVECTOR_VERSION=0.8.0 +ARG POSTGIS_VERSION=3.5.1 +ARG PG_TEXTSEARCH_VERSION=0.2.0 +ARG PGSODIUM_VERSION=3.1.9 +ARG PG_LAKE_VERSION=main + +############################################# +# Stage 1: Build extensions +############################################# +FROM postgres:${PG_VERSION}-bookworm AS builder + +ARG PGVECTOR_VERSION +ARG POSTGIS_VERSION +ARG PG_TEXTSEARCH_VERSION +ARG PGSODIUM_VERSION +ARG PG_LAKE_VERSION + +RUN apt-get update && apt-get install -y --no-install-recommends \ + git \ + build-essential \ + postgresql-server-dev-17 \ + llvm-16-dev \ + clang-16 \ + curl \ + ca-certificates \ + # PostGIS dependencies + libgeos-dev \ + libproj-dev \ + libgdal-dev \ + libjson-c-dev \ + libprotobuf-c-dev \ + protobuf-c-compiler \ + libxml2-dev \ + libpcre2-dev \ + libsodium-dev \ + # PostGIS build tools + perl \ + flex \ + bison \ + # pg_lake dependencies + cmake \ + ninja-build \ + libssl-dev \ + libsnappy-dev \ + libjansson-dev \ + liblz4-dev \ + liblzma-dev \ + libzstd-dev \ + libpq-dev \ + libkrb5-dev \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /build + +# pgvector +RUN git clone --branch v${PGVECTOR_VERSION} --depth 1 https://github.com/pgvector/pgvector.git && \ + cd pgvector && \ + make OPTFLAGS="" -j$(nproc) && \ + make install + +# PostGIS with Tiger geocoder and address standardizer +RUN curl -L https://download.osgeo.org/postgis/source/postgis-${POSTGIS_VERSION}.tar.gz | tar xz && \ + cd postgis-${POSTGIS_VERSION} && \ + ./configure --without-raster --without-topology && \ + make -j$(nproc) && \ + make install + +# pg_textsearch (BM25) +RUN git clone --branch v${PG_TEXTSEARCH_VERSION} --depth 1 https://github.com/timescale/pg_textsearch.git && \ + cd pg_textsearch && \ + # Fix missing math.h include (upstream bug) + sed -i '1i #include ' src/am/build.c && \ + make -j$(nproc) && \ + make install + +# pgsodium +RUN git clone --branch v${PGSODIUM_VERSION} --depth 1 https://github.com/michelp/pgsodium.git && \ + cd pgsodium && \ + make -j$(nproc) && \ + make install + +# pg_lake - Postgres with Iceberg and data lake access +RUN git clone --branch ${PG_LAKE_VERSION} --depth 1 --recurse-submodules https://github.com/Snowflake-Labs/pg_lake.git && \ + cd pg_lake && \ + # Build and install avro library + cd avro && git checkout -f . && git apply --ignore-whitespace ../avro.patch && \ + mkdir -p lang/c/build && cd lang/c/build && \ + cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=RelWithDebInfo && \ + make -j$(nproc) && make install && \ + cd /build/pg_lake && \ + # Build pg_lake extensions in dependency order + make -C pg_map && make -C pg_map install && \ + make -C pg_extension_base && make -C pg_extension_base install && \ + make -C pg_extension_updater && make -C pg_extension_updater install && \ + make -C pg_lake_engine && make -C pg_lake_engine install && \ + make -C pg_lake_copy && make -C pg_lake_copy install && \ + make -C pg_lake_iceberg && make -C pg_lake_iceberg install && \ + make -C pg_lake_table && make -C pg_lake_table install && \ + make -C pg_lake && make -C pg_lake install + +############################################# +# Stage 2: Final runtime image +############################################# +FROM postgres:${PG_VERSION}-bookworm + +# Runtime deps only +RUN apt-get update && apt-get install -y --no-install-recommends \ + libgeos-c1v5 \ + libproj25 \ + libgdal32 \ + libjson-c5 \ + libprotobuf-c1 \ + libxml2 \ + libpcre2-8-0 \ + libsodium23 \ + # pg_lake runtime dependencies + libsnappy1v5 \ + libjansson4 \ + liblz4-1 \ + liblzma5 \ + libzstd1 \ + libpq5 \ + && rm -rf /var/lib/apt/lists/* + +# Copy compiled extensions from builder +COPY --from=builder /usr/lib/postgresql/17/lib/ /usr/lib/postgresql/17/lib/ +COPY --from=builder /usr/share/postgresql/17/extension/ /usr/share/postgresql/17/extension/ +# Copy avro library for pg_lake +COPY --from=builder /usr/local/lib/libavro* /usr/local/lib/ + +# Update library cache +RUN ldconfig + +LABEL org.opencontainers.image.source="https://github.com/constructive-io/docker" +LABEL org.opencontainers.image.description="PostgreSQL 17 with pgvector, PostGIS, pg_textsearch, pgsodium, and pg_lake (Debian-based)" diff --git a/Makefile b/Makefile index 84da59b..2d68802 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,22 @@ -.PHONY: build run stop clean test shell push +.PHONY: build build-lake run run-lake stop clean test test-lake shell push push-lake IMAGE_NAME ?= constructive/postgres +IMAGE_NAME_LAKE ?= constructive/postgres-lake IMAGE_TAG ?= latest CONTAINER_NAME ?= constructive-pg POSTGRES_PASSWORD ?= postgres +# Build postgres-plus (Alpine, lean) build: docker build -t $(IMAGE_NAME):$(IMAGE_TAG) . +# Build postgres-plus-lake (Debian, with pg_lake) +build-lake: + docker build -t $(IMAGE_NAME_LAKE):$(IMAGE_TAG) -f Dockerfile.pg_lake . + +# Build both images +build-all: build build-lake + run: docker run -d \ --name $(CONTAINER_NAME) \ @@ -15,9 +24,18 @@ run: -p 5432:5432 \ $(IMAGE_NAME):$(IMAGE_TAG) +run-lake: + docker run -d \ + --name $(CONTAINER_NAME)-lake \ + -e POSTGRES_PASSWORD=$(POSTGRES_PASSWORD) \ + -p 5432:5432 \ + $(IMAGE_NAME_LAKE):$(IMAGE_TAG) + stop: docker stop $(CONTAINER_NAME) || true docker rm $(CONTAINER_NAME) || true + docker stop $(CONTAINER_NAME)-lake || true + docker rm $(CONTAINER_NAME)-lake || true restart: stop run @@ -27,6 +45,7 @@ shell: logs: docker logs -f $(CONTAINER_NAME) +# Test postgres-plus (Alpine) test: build @echo "Starting container..." @docker run -d --name $(CONTAINER_NAME)-test \ @@ -40,13 +59,38 @@ test: build CREATE EXTENSION postgis; \ CREATE EXTENSION pg_textsearch; \ CREATE EXTENSION pgsodium; \ - CREATE EXTENSION pg_lake; \ SELECT 'all extensions OK';" @docker stop $(CONTAINER_NAME)-test > /dev/null @docker rm $(CONTAINER_NAME)-test > /dev/null +# Test postgres-plus-lake (Debian with pg_lake) +test-lake: build-lake + @echo "Starting container..." + @docker run -d --name $(CONTAINER_NAME)-lake-test \ + -e POSTGRES_PASSWORD=test \ + $(IMAGE_NAME_LAKE):$(IMAGE_TAG) > /dev/null + @echo "Waiting for postgres..." + @sleep 5 + @echo "Testing extensions..." + @docker exec $(CONTAINER_NAME)-lake-test psql -U postgres -c " \ + CREATE EXTENSION vector; \ + CREATE EXTENSION postgis; \ + CREATE EXTENSION pg_textsearch; \ + CREATE EXTENSION pgsodium; \ + CREATE EXTENSION pg_lake; \ + SELECT 'all extensions OK';" + @docker stop $(CONTAINER_NAME)-lake-test > /dev/null + @docker rm $(CONTAINER_NAME)-lake-test > /dev/null + +# Test both images +test-all: test test-lake + clean: stop docker rmi $(IMAGE_NAME):$(IMAGE_TAG) || true + docker rmi $(IMAGE_NAME_LAKE):$(IMAGE_TAG) || true push: docker push $(IMAGE_NAME):$(IMAGE_TAG) + +push-lake: + docker push $(IMAGE_NAME_LAKE):$(IMAGE_TAG) diff --git a/README.md b/README.md index 9dde5d5..2bf73b8 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,34 @@ constructive

-Lean PostgreSQL 17 image with essential extensions for modern applications. +PostgreSQL 17 images with essential extensions for modern applications. -## Extensions +## Images + +This repository provides two Docker images: + +### postgres-plus (Alpine, lean) + +Lightweight image based on Alpine Linux with core extensions. + +```bash +docker pull ghcr.io/constructive-io/docker/postgres-plus:latest +``` + +| Extension | Description | +|-----------|-------------| +| [pgvector](https://github.com/pgvector/pgvector) | Vector similarity search for embeddings | +| [PostGIS](https://postgis.net/) | Spatial and geographic data | +| [pg_textsearch](https://www.tigerdata.com/docs/use-timescale/latest/extensions/pg-textsearch) | BM25 full-text search | +| [pgsodium](https://github.com/michelp/pgsodium) | Encryption using libsodium | + +### postgres-plus-lake (Debian, with pg_lake) + +Full-featured image based on Debian with all extensions including pg_lake for data lake access. + +```bash +docker pull ghcr.io/constructive-io/docker/postgres-plus-lake:latest +``` | Extension | Description | |-----------|-------------| @@ -19,15 +44,19 @@ Lean PostgreSQL 17 image with essential extensions for modern applications. ## Usage ```bash -# Pull the image -docker pull ghcr.io/constructive-io/docker:latest +# Run postgres-plus (Alpine) +docker run -d \ + --name postgres \ + -e POSTGRES_PASSWORD=secret \ + -p 5432:5432 \ + ghcr.io/constructive-io/docker/postgres-plus:latest -# Run +# Run postgres-plus-lake (Debian with pg_lake) docker run -d \ --name postgres \ -e POSTGRES_PASSWORD=secret \ -p 5432:5432 \ - ghcr.io/constructive-io/docker:latest + ghcr.io/constructive-io/docker/postgres-plus-lake:latest ``` Enable extensions as needed: @@ -37,16 +66,28 @@ CREATE EXTENSION vector; CREATE EXTENSION postgis; CREATE EXTENSION pg_textsearch; CREATE EXTENSION pgsodium; -CREATE EXTENSION pg_lake; +CREATE EXTENSION pg_lake; -- only available in postgres-plus-lake ``` ## Build ```bash -make build # Build image -make test # Build and verify extensions -make run # Run container -make shell # psql into container -make clean # Remove image +# postgres-plus (Alpine) +make build # Build image +make test # Build and verify extensions +make run # Run container + +# postgres-plus-lake (Debian with pg_lake) +make build-lake # Build image +make test-lake # Build and verify extensions +make run-lake # Run container + +# Both images +make build-all # Build both images +make test-all # Test both images + +# Common +make shell # psql into container +make clean # Remove images ``` From a3a9c63b0eff54ebbb61c25bfce29b11e2fcb733 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 11 Jan 2026 13:44:18 +0000 Subject: [PATCH 4/9] Fix PostGIS build: use sequential make to avoid race condition The parallel make was causing race conditions with the raster module even when configured with --without-raster. --- Dockerfile.pg_lake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile.pg_lake b/Dockerfile.pg_lake index ac2deb7..617d76c 100644 --- a/Dockerfile.pg_lake +++ b/Dockerfile.pg_lake @@ -63,11 +63,11 @@ RUN git clone --branch v${PGVECTOR_VERSION} --depth 1 https://github.com/pgvecto make OPTFLAGS="" -j$(nproc) && \ make install -# PostGIS with Tiger geocoder and address standardizer +# PostGIS (without raster and topology for smaller build) RUN curl -L https://download.osgeo.org/postgis/source/postgis-${POSTGIS_VERSION}.tar.gz | tar xz && \ cd postgis-${POSTGIS_VERSION} && \ ./configure --without-raster --without-topology && \ - make -j$(nproc) && \ + make && \ make install # pg_textsearch (BM25) From 8538c9ecdd5ae0a6c5d962ac0e55db39ea5dc3d3 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 11 Jan 2026 13:49:39 +0000 Subject: [PATCH 5/9] Fix avro build: add pkg-config for libjansson detection CMake couldn't find libjansson because pkg-config was missing. --- Dockerfile.pg_lake | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile.pg_lake b/Dockerfile.pg_lake index 617d76c..b985d45 100644 --- a/Dockerfile.pg_lake +++ b/Dockerfile.pg_lake @@ -45,6 +45,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # pg_lake dependencies cmake \ ninja-build \ + pkg-config \ libssl-dev \ libsnappy-dev \ libjansson-dev \ From c60447cd8e34213f3ded547a1404da7b59ed1394 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 11 Jan 2026 13:57:38 +0000 Subject: [PATCH 6/9] Build PostgreSQL from source for pg_lake internal headers pg_lake requires PostgreSQL internal headers (like server/rewrite/rewriteManip.h) that are not available in pre-built packages. This follows pg_lake's official Dockerfile approach of building PostgreSQL from source. Changes: - Use debian:bookworm-slim as base instead of postgres:17-bookworm - Build PostgreSQL 17.2 from source with required configure flags - Include simple entrypoint script for database initialization - Add all required runtime dependencies --- Dockerfile.pg_lake | 154 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 122 insertions(+), 32 deletions(-) diff --git a/Dockerfile.pg_lake b/Dockerfile.pg_lake index b985d45..6781829 100644 --- a/Dockerfile.pg_lake +++ b/Dockerfile.pg_lake @@ -1,8 +1,8 @@ # PostgreSQL image with pgvector, PostGIS, pg_textsearch, pgsodium, and pg_lake -# Uses Debian base for pg_lake compatibility (requires full PostgreSQL server headers) +# Uses Debian base with PostgreSQL built from source (required for pg_lake internal headers) # Multi-stage build - all toolchains discarded, only artifacts kept -ARG PG_VERSION=17 +ARG PG_VERSION=17.2 ARG PGVECTOR_VERSION=0.8.0 ARG POSTGIS_VERSION=3.5.1 ARG PG_TEXTSEARCH_VERSION=0.2.0 @@ -10,24 +10,36 @@ ARG PGSODIUM_VERSION=3.1.9 ARG PG_LAKE_VERSION=main ############################################# -# Stage 1: Build extensions +# Stage 1: Build PostgreSQL and extensions ############################################# -FROM postgres:${PG_VERSION}-bookworm AS builder +FROM debian:bookworm-slim AS builder +ARG PG_VERSION ARG PGVECTOR_VERSION ARG POSTGIS_VERSION ARG PG_TEXTSEARCH_VERSION ARG PGSODIUM_VERSION ARG PG_LAKE_VERSION +# Install build dependencies RUN apt-get update && apt-get install -y --no-install-recommends \ git \ build-essential \ - postgresql-server-dev-17 \ - llvm-16-dev \ - clang-16 \ curl \ ca-certificates \ + wget \ + # PostgreSQL build dependencies + libreadline-dev \ + zlib1g-dev \ + libssl-dev \ + libxml2-dev \ + libxslt1-dev \ + libicu-dev \ + uuid-dev \ + liblz4-dev \ + flex \ + bison \ + pkg-config \ # PostGIS dependencies libgeos-dev \ libproj-dev \ @@ -35,55 +47,72 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libjson-c-dev \ libprotobuf-c-dev \ protobuf-c-compiler \ - libxml2-dev \ libpcre2-dev \ - libsodium-dev \ - # PostGIS build tools perl \ - flex \ - bison \ + # pgsodium dependencies + libsodium-dev \ # pg_lake dependencies cmake \ ninja-build \ - pkg-config \ - libssl-dev \ libsnappy-dev \ libjansson-dev \ - liblz4-dev \ liblzma-dev \ libzstd-dev \ - libpq-dev \ libkrb5-dev \ + libcurl4-openssl-dev \ && rm -rf /var/lib/apt/lists/* WORKDIR /build +# Build PostgreSQL from source (required for pg_lake internal headers) +ENV PGBASEDIR=/usr/local/pgsql +RUN wget https://ftp.postgresql.org/pub/source/v${PG_VERSION}/postgresql-${PG_VERSION}.tar.gz && \ + tar -xzf postgresql-${PG_VERSION}.tar.gz && \ + cd postgresql-${PG_VERSION} && \ + ./configure --prefix=${PGBASEDIR} \ + --with-openssl \ + --with-libxml \ + --with-libxslt \ + --with-icu \ + --with-uuid=ossp \ + --with-lz4 && \ + make -j$(nproc) && \ + make install && \ + cd contrib && make -j$(nproc) install && \ + cd ../.. && rm -rf postgresql-${PG_VERSION}* + +# Set PATH for pg_config +ENV PATH="${PGBASEDIR}/bin:${PATH}" + # pgvector RUN git clone --branch v${PGVECTOR_VERSION} --depth 1 https://github.com/pgvector/pgvector.git && \ cd pgvector && \ make OPTFLAGS="" -j$(nproc) && \ - make install + make install && \ + cd .. && rm -rf pgvector # PostGIS (without raster and topology for smaller build) RUN curl -L https://download.osgeo.org/postgis/source/postgis-${POSTGIS_VERSION}.tar.gz | tar xz && \ cd postgis-${POSTGIS_VERSION} && \ - ./configure --without-raster --without-topology && \ + ./configure --without-raster --without-topology --with-pgconfig=${PGBASEDIR}/bin/pg_config && \ make && \ - make install + make install && \ + cd .. && rm -rf postgis-${POSTGIS_VERSION} # pg_textsearch (BM25) RUN git clone --branch v${PG_TEXTSEARCH_VERSION} --depth 1 https://github.com/timescale/pg_textsearch.git && \ cd pg_textsearch && \ - # Fix missing math.h include (upstream bug) sed -i '1i #include ' src/am/build.c && \ make -j$(nproc) && \ - make install + make install && \ + cd .. && rm -rf pg_textsearch # pgsodium RUN git clone --branch v${PGSODIUM_VERSION} --depth 1 https://github.com/michelp/pgsodium.git && \ cd pgsodium && \ make -j$(nproc) && \ - make install + make install && \ + cd .. && rm -rf pgsodium # pg_lake - Postgres with Iceberg and data lake access RUN git clone --branch ${PG_LAKE_VERSION} --depth 1 --recurse-submodules https://github.com/Snowflake-Labs/pg_lake.git && \ @@ -102,40 +131,101 @@ RUN git clone --branch ${PG_LAKE_VERSION} --depth 1 --recurse-submodules https:/ make -C pg_lake_copy && make -C pg_lake_copy install && \ make -C pg_lake_iceberg && make -C pg_lake_iceberg install && \ make -C pg_lake_table && make -C pg_lake_table install && \ - make -C pg_lake && make -C pg_lake install + make -C pg_lake && make -C pg_lake install && \ + cd .. && rm -rf pg_lake ############################################# # Stage 2: Final runtime image ############################################# -FROM postgres:${PG_VERSION}-bookworm +FROM debian:bookworm-slim # Runtime deps only RUN apt-get update && apt-get install -y --no-install-recommends \ + libreadline8 \ + zlib1g \ + libssl3 \ + libxml2 \ + libxslt1.1 \ + libicu72 \ + libossp-uuid16 \ + liblz4-1 \ + # PostGIS runtime libgeos-c1v5 \ libproj25 \ libgdal32 \ libjson-c5 \ libprotobuf-c1 \ - libxml2 \ libpcre2-8-0 \ + # pgsodium runtime libsodium23 \ # pg_lake runtime dependencies libsnappy1v5 \ libjansson4 \ - liblz4-1 \ liblzma5 \ libzstd1 \ - libpq5 \ - && rm -rf /var/lib/apt/lists/* + libkrb5-3 \ + libcurl4 \ + gosu \ + locales \ + && rm -rf /var/lib/apt/lists/* \ + && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 + +ENV LANG en_US.utf8 + +# Create postgres user +RUN groupadd -r postgres --gid=999 && \ + useradd -r -g postgres --uid=999 --home-dir=/var/lib/postgresql --shell=/bin/bash postgres && \ + mkdir -p /var/lib/postgresql && \ + chown -R postgres:postgres /var/lib/postgresql + +# Copy PostgreSQL installation from builder +COPY --from=builder /usr/local/pgsql /usr/local/pgsql -# Copy compiled extensions from builder -COPY --from=builder /usr/lib/postgresql/17/lib/ /usr/lib/postgresql/17/lib/ -COPY --from=builder /usr/share/postgresql/17/extension/ /usr/share/postgresql/17/extension/ # Copy avro library for pg_lake COPY --from=builder /usr/local/lib/libavro* /usr/local/lib/ +# Set up paths and environment +ENV PATH="/usr/local/pgsql/bin:${PATH}" +ENV PGDATA=/var/lib/postgresql/data +ENV LD_LIBRARY_PATH="/usr/local/lib" + # Update library cache RUN ldconfig +# Create data directory +RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 1777 "$PGDATA" + +# Create run directory for socket +RUN mkdir -p /var/run/postgresql && chown -R postgres:postgres /var/run/postgresql && chmod 3777 /var/run/postgresql + +VOLUME /var/lib/postgresql/data + +EXPOSE 5432 + +# Simple entrypoint that initializes DB if needed and starts postgres +COPY --chmod=755 <<'EOF' /usr/local/bin/docker-entrypoint.sh +#!/bin/bash +set -e + +# If PGDATA is empty, initialize the database +if [ -z "$(ls -A "$PGDATA" 2>/dev/null)" ]; then + gosu postgres initdb --username=postgres --pwfile=<(echo "${POSTGRES_PASSWORD:-postgres}") + + # Allow connections from anywhere + echo "host all all 0.0.0.0/0 md5" >> "$PGDATA/pg_hba.conf" + echo "listen_addresses = '*'" >> "$PGDATA/postgresql.conf" +fi + +# If first arg is postgres or not provided, run postgres +if [ "$1" = 'postgres' ] || [ -z "$1" ]; then + exec gosu postgres postgres -D "$PGDATA" +fi + +exec "$@" +EOF + +ENTRYPOINT ["docker-entrypoint.sh"] +CMD ["postgres"] + LABEL org.opencontainers.image.source="https://github.com/constructive-io/docker" -LABEL org.opencontainers.image.description="PostgreSQL 17 with pgvector, PostGIS, pg_textsearch, pgsodium, and pg_lake (Debian-based)" +LABEL org.opencontainers.image.description="PostgreSQL 17 with pgvector, PostGIS, pg_textsearch, pgsodium, and pg_lake (Debian-based, built from source)" From a7e7d9e22033e2a9af681c0fc1e35986b6717d0a Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 11 Jan 2026 13:59:45 +0000 Subject: [PATCH 7/9] Fix PostgreSQL version: use 17.7 (latest available) --- Dockerfile.pg_lake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.pg_lake b/Dockerfile.pg_lake index 6781829..1eb7ff0 100644 --- a/Dockerfile.pg_lake +++ b/Dockerfile.pg_lake @@ -2,7 +2,7 @@ # Uses Debian base with PostgreSQL built from source (required for pg_lake internal headers) # Multi-stage build - all toolchains discarded, only artifacts kept -ARG PG_VERSION=17.2 +ARG PG_VERSION=17.7 ARG PGVECTOR_VERSION=0.8.0 ARG POSTGIS_VERSION=3.5.1 ARG PG_TEXTSEARCH_VERSION=0.2.0 From 23b9c17d032691e616a8ed112ce58e5aecb4af3a Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 11 Jan 2026 14:02:52 +0000 Subject: [PATCH 8/9] Fix pg_lake build: use Dockerfile default PG_VERSION (17.7) --- .github/workflows/docker.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 01f0d8d..9758cc3 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -160,8 +160,8 @@ jobs: push: false tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - build-args: | - PG_VERSION=${{ env.PG_VERSION }} + # Note: pg_lake image uses Dockerfile default PG_VERSION (full version like 17.7) + # because it builds PostgreSQL from source and needs exact version number cache-from: type=gha,scope=postgres-plus-lake-${{ matrix.arch }} cache-to: type=gha,mode=max,scope=postgres-plus-lake-${{ matrix.arch }} @@ -175,8 +175,8 @@ jobs: platforms: ${{ matrix.platform }} labels: ${{ steps.meta.outputs.labels }} outputs: type=image,name=${{ env.REGISTRY }}/constructive-io/docker/postgres-plus-lake,push-by-digest=true,push=true - build-args: | - PG_VERSION=${{ env.PG_VERSION }} + # Note: pg_lake image uses Dockerfile default PG_VERSION (full version like 17.7) + # because it builds PostgreSQL from source and needs exact version number cache-from: type=gha,scope=postgres-plus-lake-${{ matrix.arch }} cache-to: type=gha,mode=max,scope=postgres-plus-lake-${{ matrix.arch }} From 4b2dff1e3886771099e8400e8118b069693b68be Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 11 Jan 2026 14:05:17 +0000 Subject: [PATCH 9/9] Fix PostgreSQL build: use libossp-uuid-dev for OSSP UUID support --- Dockerfile.pg_lake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.pg_lake b/Dockerfile.pg_lake index 1eb7ff0..b2c6b5d 100644 --- a/Dockerfile.pg_lake +++ b/Dockerfile.pg_lake @@ -35,7 +35,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libxml2-dev \ libxslt1-dev \ libicu-dev \ - uuid-dev \ + libossp-uuid-dev \ liblz4-dev \ flex \ bison \