Postgres shuts down immediately when started with docker-compose

I'm using the same Postgres docker image version of yours (9.5) and I was running into the same problem.

The first time the container is created, Postgres run a series of commands and in the end, it just sends a shutdown signal and the server becomes unresponsive (but it works the second time onwards).

After several trials, I figured that once I tried to connect to the server, before it was ready to accept connections, PostgresDB would shutdown unexpectedly, and the same would happen for any client trying to connect remotely (outside the container).

I came across this error in the following scenario - I have two containers: one for the PostgresDB itself and other containing a Postgres client (psql) that tries to connect to the first container to create some users, databases and run a liquibase script that creates all the schemas.

At first, I was using a loop in my bash script checking if the server was available every 5 seconds, then after the first attempt, Postgres issued a signal to shutdown and becomes unresponsive.

I could get rid of this error by adding a healthcheck in my docker-compose.yml:

Checkout the CHANGE 1 and CHANGE 2 comments below

version: '3.9'
services:
  postgres-db:
    container_name: ${POSTGRES_HOST}
    image: postgres:9.5
    restart: always
    ports:
      - "5432:5432"
    command: postgres
    expose:
      - 5432
    environment:
      POSTGRES_USER: "${POSTGRES_USER}"
      POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
      POSTGRES_DB: "${POSTGRES_DB}"

      #this ENV variable is only required for the healthcheck section - if you don't specify it, the check command will fail stating the root user doesn't exist in posgres
      PGUSER: "postgres"
    healthcheck:
      #CHANGE 1: this command checks if the database is ready, right on the source db server
      test: [ "CMD-SHELL", "pg_isready" ]
      interval: 5s
      timeout: 5s
      retries: 5

  liquibase:
    container_name: liquibase-schema-config
    image: company/liquibase
    build:
      context: ./liquibase
    environment:
      - PGPASSWORD=${POSTGRES_PASSWORD}
      - PGPORT=${POSTGRES_PORT}
      - PGHOST=${POSTGRES_HOST}
      - PGUSER=${POSTGRES_USER}
      - PGDATABASE=${POSTGRES_DB}

      - JDBC_URL=jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/
      - LIQUIBASE_HOME=${LIQUIBASE_HOME}
    depends_on:
      #CHANGE 2: it prevents issuing a request while the server is starting to depend on the healthy status of postgres-db 
      postgres-db:
        condition: service_healthy

EDIT: There was another issue preventing Docker from accessing VPN protected sites (and even internet sites) while using Cisco AnyConnect on Linux (it doesn't happen on MacOS). To get around this unwanted behavior I installed openconnect sudo apt install openconnect on my Ubuntu and stopped using AnyConnect.

Hope it helps!


I tried your docker-compose and the service seems running in the container:

root@0afe99de0f0b:/# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
postgres     1  0.5  0.8 227148 16128 ?        Ss   14:42   0:00 postgres
postgres    74  0.0  0.0 227148  1768 ?        Ss   14:42   0:00 postgres: checkpointer process  
postgres    75  0.0  0.0 227148  1772 ?        Ss   14:42   0:00 postgres: writer process  
postgres    76  0.0  0.0 227148  1768 ?        Ss   14:42   0:00 postgres: wal writer process  
postgres    77  0.0  0.1 227576  2720 ?        Ss   14:42   0:00 postgres: autovacuum launcher process  
postgres    78  0.0  0.0  82132  1888 ?        Ss   14:42   0:00 postgres: stats collector process  
root        79  2.0  0.0  21820  1984 ?        Ss   14:42   0:00 /bin/bash
root        84  0.0  0.0  19092  1296 ?        R+   14:42   0:00 ps aux

Anyway, for my project I use another image for postgresql: https://github.com/sameersbn/docker-postgresql. This one works fine.


If you look at your log output, the following lines appear towards the end:

local-postgres9.5 | server stopped
local-postgres9.5 |
local-postgres9.5 | PostgreSQL init process complete; ready for start up.

Apparently, stopping and restarting the Postgres server is part of the initialisation process. In fact, the second-to-last line says

local-postgres9.5 | LOG:  database system is ready to accept connections.