From c6f7e6c7ccf47de01a2e542ec56407584b9ae27d Mon Sep 17 00:00:00 2001 From: Maxime Killinger Date: Thu, 25 Dec 2025 16:46:34 +0100 Subject: [PATCH] fix(docker): resolve permission denied error for PG18+ volume mounts PostgreSQL 18+ Docker images changed the data directory structure to use versioned subdirectories (e.g., /var/lib/postgresql/18/main) instead of the traditional /var/lib/postgresql/data path. Changes: - Dockerfile: Add mkdir and chown to ensure /var/lib/postgresql has correct permissions for the postgres user before volume mount - README.md: Update Quick Start with volume mount example - README.md: Add 'Data Persistence' section explaining PG18+ requirements This fixes the 'mkdir: cannot create directory: Permission denied' error that occurred when mounting volumes at /var/lib/postgresql. See: https://github.com/docker-library/postgres/pull/1259 --- .gitea/workflows/docker-build.yml | 12 ++++++------ Dockerfile | 3 +++ README.md | 7 +++++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml index 5003fd3..3d6b8c0 100644 --- a/.gitea/workflows/docker-build.yml +++ b/.gitea/workflows/docker-build.yml @@ -13,20 +13,20 @@ jobs: pg_version: [15, 16, 17, 18] steps: - name: 📥 Checkout code - uses: actions/checkout@v4 + uses: https://github.com/actions/checkout@v4 - name: 🛠️ Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: https://github.com/docker/setup-buildx-action@v3 - name: 🔐 Login to Gitea Registry - uses: docker/login-action@v3 + uses: https://github.com/docker/login-action@v3 with: registry: gitea.killinger.fr username: maxime.killinger password: ${{ secrets.DOCKER_TOKEN }} - name: 📦 Build Docker image - uses: docker/build-push-action@v5 + uses: https://github.com/docker/build-push-action@v5 with: context: . load: true @@ -74,7 +74,7 @@ jobs: run: docker rm -f test-pg${{ matrix.pg_version }} || true - name: 🚀 Push Docker image - uses: docker/build-push-action@v5 + uses: https://github.com/docker/build-push-action@v5 with: context: . push: true @@ -85,7 +85,7 @@ jobs: - name: 🏷️ Tag latest (PG18 only) if: matrix.pg_version == 18 - uses: docker/build-push-action@v5 + uses: https://github.com/docker/build-push-action@v5 with: context: . push: true diff --git a/Dockerfile b/Dockerfile index c4b55f0..736cefd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -46,6 +46,9 @@ COPY --from=builder /tmp/timescaledb/usr/share/postgresql/ /usr/share/postgresql COPY init-extensions.sh /docker-entrypoint-initdb.d/ RUN chmod +x /docker-entrypoint-initdb.d/init-extensions.sh +# Ensure correct permissions for data directory (important for PG18+ with volume mounts) +RUN mkdir -p /var/lib/postgresql && chown -R postgres:postgres /var/lib/postgresql + # Healthcheck HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \ CMD pg_isready -U postgres || exit 1 diff --git a/README.md b/README.md index a59f6bb..0326fcc 100644 --- a/README.md +++ b/README.md @@ -23,12 +23,19 @@ Docker image combining **PostgreSQL** with three powerful extensions: docker run -d \ --name my-postgres \ -e POSTGRES_PASSWORD=mysecretpassword \ + -v postgres_data:/var/lib/postgresql \ -p 5432:5432 \ gitea.killinger.fr/maxime.killinger/postgres-ts-vectors:latest ``` All extensions are **automatically created** on first startup. +## Data Persistence + +> [!IMPORTANT] +> Starting with PostgreSQL 18, mount volumes at `/var/lib/postgresql` (not `/var/lib/postgresql/data`). +> Data will be stored in a versioned subdirectory (e.g., `/var/lib/postgresql/18/main`), which facilitates future upgrades with `pg_upgrade`. + ## Environment Variables | Variable | Description | Default |