Note on PGDATA changes for PostgreSQL 18+#2582
Note on PGDATA changes for PostgreSQL 18+#2582yosifkit merged 1 commit intodocker-library:masterfrom
Conversation
postgres/content.md
Outdated
| ### `PGDATA` | ||
|
|
||
| > **Important Note:** Mount the data volume at `/var/lib/postgresql/data` and not at `/var/lib/postgresql` because mounts at the latter path WILL NOT PERSIST database data when the container is re-created. The Dockerfile that builds the image declares a volume at `/var/lib/postgresql/data` and if no data volume is mounted at that path then the container runtime will automatically create an [anonymous volume](https://docs.docker.com/engine/storage/#volumes) that is not reused across container re-creations. Data will be written to the anonymous volume rather than your intended data volume and won't persist when the container is deleted and re-created. | ||
| > **Important Change:** the `PGDATA` environment variable of the image was changed to be version specific in PostgreSQL 18 and above. For 18 it is `/var/lib/postgresql/18/docker`. Later versions will replace `18` with their respective major version (e.g., `/var/lib/postgresql/19/docker` for PostgreSQL `19.x`). The defined `VOLUME` was changed in 18 and above to `/var/lib/postgresql`. Mounts and volumes should be targeted at the updated location. This will allow users upgrading between PostgreSQL major releases to use the faster `--link` when running `pg_upgrade` and mounting `/var/lib/postgresql`. |
There was a problem hiding this comment.
IMO we should link this explicitly over to docker-library/postgres#1259 somewhere. I wonder if we should also add more explicit guidance around setting PGDATA explicitly, either to avoid this change or to opt into this change sooner?
| > **Important Change:** the `PGDATA` environment variable of the image was changed to be version specific in PostgreSQL 18 and above. For 18 it is `/var/lib/postgresql/18/docker`. Later versions will replace `18` with their respective major version (e.g., `/var/lib/postgresql/19/docker` for PostgreSQL `19.x`). The defined `VOLUME` was changed in 18 and above to `/var/lib/postgresql`. Mounts and volumes should be targeted at the updated location. This will allow users upgrading between PostgreSQL major releases to use the faster `--link` when running `pg_upgrade` and mounting `/var/lib/postgresql`. | |
| > **Important Change:** [the `PGDATA` environment variable of the image was changed to be version specific in PostgreSQL 18 and above](https://github.com/docker-library/postgres/pull/1259). For 18 it is `/var/lib/postgresql/18/docker`. Later versions will replace `18` with their respective major version (e.g., `/var/lib/postgresql/19/docker` for PostgreSQL `19.x`). The defined `VOLUME` was changed in 18 and above to `/var/lib/postgresql`. Mounts and volumes should be targeted at the updated location. This will allow users upgrading between PostgreSQL major releases to use the faster `--link` when running `pg_upgrade` and mounting `/var/lib/postgresql`. | |
| Users who wish to opt-in to this change on older releases can do so by setting `PGDATA` explicitly (`--env PGDATA=/var/lib/postgresql/17/docker --volume some-postgres:/var/lib/postgresql`). To migrate pre-existing data, adjust the volume's folder structure appropriately first (moving all database files into a `PG_MAJOR/docker` subdirectory). |
|
Ready to go once we merge docker-library/postgres#1344 and docker-library/postgres#1259. |
|
With docker-library/official-images#19955, we should probably re-evaluate our ordering/wording to make sure it's clear that the 18+ behavior is the default and the prior behavior is (now) the exception. |
|
This is very confusing. The example for older versions tells me to do this: --env PGDATA=/var/lib/postgresql/17/docker --volume some-postgres:/var/lib/postgresqland then literally the next paragraph tells me not to do that:
Which one should I follow? |
|
You're omitting from your quotes the important context for each of those lines:
and
Granted, yes, that later note's wording could be updated to make it more clear that you shouldn't do it if you've set So to be explicitly clear: if you opt into the |
|
I ran into this error and found the note rather long and not very helpful in answer the question: how do I fix this? I appreciate the links to all the context and history but I think the first thing should be concise concrete steps on how to fix this, e.g. |
Document docker-library/postgres#1259