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?
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)
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
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
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
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.
La solution la plus simple est un script bash court:
while ! nc -z Host PORT; do sleep 1; done;
./run-smth-else;