web-dev-qa-db-fra.com

Docker assister que postgresql soit lancé

J'utilise postgresql avec Django dans mon projet. Je les ai dans différents conteneurs et le problème est que je dois attendre postgres avant de lancer Django. En ce moment, je le fais avec sleep 5 dans le fichier command.sh pour le conteneur Django. J'ai aussi constaté que netcat peut faire l'affaire mais je préférerais une solution sans paquets supplémentaires. curl et wget ne peuvent pas faire cela car ils ne supportent pas le protocole postgres. Y a-t-il un moyen de le faire?

8
Quba

Problème avec votre solution tiziano est que curl n’est pas installé par défaut et je voulais éviter d’installer des éléments supplémentaires. Quoi qu'il en soit, j'ai fait ce que bereal a dit. Voici le script si quelqu'un en aurait besoin.

import socket
import time
import os

port = int(os.environ["DB_PORT"]) # 5432

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True:
    try:
        s.connect(('myproject-db', port))
        s.close()
        break
    except socket.error as ex:
        time.sleep(0.1)
7
Quba

Si vous avez psql, vous pouvez simplement ajouter le code suivant à votre fichier .sh:

RETRIES=5

until 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 1
done
14
Mário Pinhal

Cela va permettre d’attendre le démarrage de Postgres. (Plus précisément la ligne 6). Remplacez simplement npm start par la commande de votre choix après le démarrage de Postgres.

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
9
Alister Norris

wait-for-it petits scripts d'encapsulage que vous pouvez inclure dans l'image de votre application pour interroger un hôte et un port donnés jusqu'à ce qu'il accepte les connexions TCP.

peut être cloné dans Dockerfile par la commande ci-dessous 

RUN git clone https://github.com/vishnubob/wait-for-it.git

docker-compose.yml

version: "2"
services:
   web:
     build: .
     ports:
       - "80:8000"
     depends_on:
       - "db"
     command: ["./wait-for-it/wait-for-it.sh", "db:5432", "--", "npm",  "start"]
   db:
     image: postgres
3
veeresh yh

Pourquoi ne pas curl?

Quelque chose comme ça:

while ! curl http://$POSTGRES_PORT_5432_TCP_ADDR:$POSTGRES_PORT_5432_TCP_PORT/ 2>&1 | grep '52'
do
  sleep 1
done

Ça marche pour moi.

2
tiziano

La solution la plus simple est un script bash court:

while ! nc -z Host PORT; do sleep 1; done;
./run-smth-else;
1
Pifagorych