Docker - check if postgres is ready

super.t picture super.t · Oct 1, 2017 · Viewed 17.9k times · Source

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.

Answer

Mikko Ohtamaa picture Mikko Ohtamaa · Jul 21, 2020

Here is a shell one liner using pg_isready tool provided by PostgreSQL.

To call outside docker:

timeout 90s bash -c 'until docker exec $YOUR_DOCKER_CONTAINER_NAME pg_isready ; do sleep 5 ; done'

Based on a post from Jeroma Belleman.