fix(docker): resolve permission denied error for PG18+ volume mounts
All checks were successful
🚀 Docker Build and Push / build-and-push (15) (push) Successful in 4m59s
🚀 Docker Build and Push / build-and-push (16) (push) Successful in 4m56s
🚀 Docker Build and Push / build-and-push (17) (push) Successful in 4m56s
🚀 Docker Build and Push / build-and-push (18) (push) Successful in 4m42s

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
This commit is contained in:
2025-12-25 16:46:34 +01:00
parent df585b765a
commit c6f7e6c7cc
3 changed files with 16 additions and 6 deletions

View File

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

View File

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

View File

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