Docker wait for postgresql to be running
I've spent some hours investigating this problem and I got a solution.Docker depends_on
just consider service startup to run another service. Than it happens because as soon as db
is started, service-app tries to connect to ur db
, but it's not ready to receive connections. So you can check db
health status in app service to wait for connection. Here is my solution, it solved my problem. :)Important: I'm using docker-compose version 2.1.
version: '2.1'services: my-app: build: . command: su -c "python manage.py runserver 0.0.0.0:8000" ports: - "8000:8000" depends_on: db: condition: service_healthy links: - db volumes: - .:/app_directory db: image: postgres:10.5 ports: - "5432:5432" volumes: - database:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5volumes: database:
In this case it's not necessary to create a .sh file.I hope it helps you guys ;)cya
This will successfully wait for Postgres to start. (Specifically line 6). Just replace npm start
with whatever command you'd like to happen after Postgres has started.
services: practice_docker: image: dockerhubusername/practice_docker ports: - 80:3000 command: bash -c 'while !</dev/tcp/db/5432; do sleep 1; done; npm start' depends_on: - db environment: - DATABASE_URL=postgres://postgres:password@db:5432/practicedocker - PORT=3000 db: image: postgres environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=password - POSTGRES_DB=practicedocker
If you have psql
you could simply add the following code to your .sh file:
RETRIES=5until psql -h $PG_HOST -U $PG_USER -d $PG_DATABASE -c "select 1" > /dev/null 2>&1 || [ $RETRIES -eq 0 ]; do echo "Waiting for postgres server, $((RETRIES--)) remaining attempts..." sleep 1done