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 @@

-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 \