Postgres container crashes with `database files are incompatible with server` after container's image has been updated to the latest one

Viewed 12058

Postgres container crash on launch with the following error message

(project) ➜  project git:(feature/62-api-custom-image-categories) ✗ docker-compose up postgres
Starting project_postgres_1 ... 
Starting project_postgres_1 ... done
Attaching to project_postgres_1
postgres_1        | FATAL:  database files are incompatible with server
postgres_1        | DETAIL:  The data directory was initialized by PostgreSQL version 9.5, which is not compatible with this version 9.6.3.
project_postgres_1 exited with code 1

What options do I have? II have updated image to the latest one

Portion of my docker-compose.yml

version: '2'

volumes:
  ipython_history: {}

services:
  postgres:
    image: mdillon/postgis
    ports:
     - "5432:5432"
    environment:
      - POSTGRES_DB=p_dev
      - POSTGRES_USER=p_user
      - POSTGRES_PASSWORD=password

Is it possible to convert the data or the only option is to delete the container (losing all its data) and then re-create it?

5 Answers

I got this error because i was always using the latest version of postgres by not defining a tag at the end. Then the latest version switched to 13 and the data was not compatible anymore. Maybe just adding a version at the end might help too. -> postgres:12

postgres:
image: postgres:12
restart: always
environment: 
  POSTGRES_USER: ${POSTGRES_USER}
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
ports:
  - "5432:5432"
volumes:
  - db_data:/var/lib/postgresql/data

docker volume prune

This will remove all unused volumes. Unused here meaning any volume not used by at LEAST one container.

Although this worked for me, I'm concerned by what unused is really defining here. Does unused mean the volume exists and the image that was using it is destroyed? Or the image just isn't running anymore?

https://docs.docker.com/engine/reference/commandline/volume_prune/

I know that I am 3 years late, but the following link answered this question for me. tianon/docker-postgres-upgrade does a pg_upgrade of the postgres data to the new postgres version you want to run. Was as easy as creating a service in a docker-compose file and running it.

Related