Skip to content

Instantly share code, notes, and snippets.

@nicerobot
Created June 27, 2017 14:30
Show Gist options
  • Star 14 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save nicerobot/1136dcfba6ce3da67ce3ded5101a4078 to your computer and use it in GitHub Desktop.
Save nicerobot/1136dcfba6ce3da67ce3ded5101a4078 to your computer and use it in GitHub Desktop.
A better wait-for-postgres.sh
#!/bin/bash -e
# wait-for-postgres.sh
# Adapted from https://docs.docker.com/compose/startup-order/
# Expects the necessary PG* variables.
until psql -c '\l'; do
echo >&2 "$(date +%Y%m%dt%H%M%S) Postgres is unavailable - sleeping"
sleep 1
done
echo >&2 "$(date +%Y%m%dt%H%M%S) Postgres is up - executing command"
exec ${@}
@amikrop
Copy link

amikrop commented Apr 20, 2021

This example (as the original one in the docker website) is using the psql command. This command is not available in the "webapp" service though (only available in the "db" service). Am I getting something wrong?

@therohk
Copy link

therohk commented Nov 7, 2021

You will need to install the "postgresql-client" package for these commands to be available in the webapp.

The included pg_isready command achieves the same as above without the retry limit.

See the complete config using this technique here.

A simplified Dockerfile is shown below. You will need to include a pgsql link for hostname in docker-compose.yml.

FROM openjdk:11

RUN apt-get update && apt-get install -y procps curl net-tools telnet
RUN apt-get install -y postgresql-client

#other things

COPY build/libs/app-0.0.1.war app.war

EXPOSE 8080

CMD until pg_isready --host=pgsql; do sleep 1; done \
    && java -jar app.war

For the above script replace the CMD with :

CMD wait-for-postgres.sh && java -jar app.war

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment