Search code examples
postgresqldockercentoskong

Docker - check if postgres is ready


I have a Kong API Gateway container and a postgres container and I need to check whether postgres has started up and ready from the Kong container before running the migrations. I was thinking of installing the postgres client utilities into a custom image based on the official Kong image using RUN yum install postgresql -y && yum clean all in my Dockerfile and using either psql or pg_isready to achieve this. I've created a postgres user called polling with an empty password specifically for checking the status of the server by these two utilities. Neither of them work.

I tried to execute these commands from the custom Kong image:

  1. psql. The command psql -h postgres -U polling -w -c '\l' fails with the error psql: fe_sendauth: no password supplied. But the user has no password. What am I doing wrong? The full shell script checking whether the server is ready using psql is described here.

  2. pg_isready. I don't get how to install this utility separately into a custom image based on the official Kong image which in turn based on the centos:7 image, the postgresql package doesn't include pg_isready. Only these utilities are installed and can be found in /usr/bin: pg_config, pg_dump, pg_dumpall, pg_restore, psql. How to install pg_isready? I don't want to have the full server installation in the Kong image.


Solution

  • My solution was to create a new image based on the official kong image and override the entrypoint like this:

    #!/usr/bin/env bash
    set -e
    
    # Disabling nginx daemon mode
    export KONG_NGINX_DAEMON="off"
    
    # Setting default prefix (override any existing variable)
    export KONG_PREFIX="/usr/local/kong"
    
    # Prepare Kong prefix
    if [ "$1" = "/usr/local/openresty/nginx/sbin/nginx" ]; then
        kong prepare -p "/usr/local/kong"
    fi
    
    #waiting for postgres
    until psql --host=$KONG_PG_HOST --username=$POLLING_USER $POLLING_DATABASE -w &>/dev/null
    do
      echo "Waiting for PostgreSQL..."
      sleep 1
    done
    
    echo "Postgres is ready, running the migrations..."
    
    kong migrations up
    
    echo "READY TO START UP KONG USING CMD" $@;
    
    exec "$@"