2017-10-01 15 views
0

Ich habe einen Kong API Gateway Container und einen postgres Container und ich muss überprüfen, ob Postgres gestartet und bereit aus dem Container Kong vor dem Ausführen der Migrationen. Ich dachte über die Installation der Postgres-Client-Dienstprogramme in ein benutzerdefiniertes Bild auf der Grundlage der offiziellen Kong-Bild mit RUN yum install postgresql -y && yum clean all in meiner Dockerfile und entweder psql oder pg_isready, um dies zu erreichen. Ich habe einen Postgres-Benutzer namens polling mit einem leeren Passwort speziell für die Überprüfung des Status des Servers durch diese beiden Dienstprogramme erstellt. Keine von beiden arbeitet.Docker - überprüfen, ob Postgres bereit ist

Ich habe versucht, diese Befehle aus dem benutzerdefinierten Kong Bild auszuführen:

  1. psql. Der Befehl psql -h postgres -U polling -w -c '\l' schlägt mit dem Fehler psql: fe_sendauth: no password supplied fehl. Aber der Benutzer hat kein Passwort. Was mache ich falsch? Das vollständige Shell-Skript, das überprüft, ob der Server mit psql bereit ist, wird here beschrieben.

  2. pg_isready. Ich bekomme nicht, wie man dieses Dienstprogramm separat in ein kundenspezifisches Bild auf der Grundlage des offiziellen Kong-Bildes installiert, das wiederum auf dem centos:7 Bild basiert, enthält das postgresql Paket nicht pg_isready. Nur diese Dienstprogramme sind installiert und können in /usr/bin: pg_config, pg_dump, pg_dumpall, pg_restore, psql gefunden werden. Wie installiere ich pg_isready? Ich möchte nicht die vollständige Serverinstallation im Kong-Image haben.

+0

In Bezug auf # 1, haben Sie die pg_hba.conf angepasst? Siehe https://dba.stackexchange.com/questions/83164/remove-password-requirement-for-user-postgres – bluescores

+0

@bluescores richtig, ich muss diese Konfiguration ändern oder .pgpass auf dem Client hinzufügen. Das Problem mit letzterem gelöst. Ich sollte bemerken, dass ich ein Passwort für meinen Polling-Benutzer einrichten musste, psql schrie mich an, wenn der Pass leer war, unabhängig von .pgpass – Sergey

Antwort

1

Meine Lösung war es, ein neues Bild basierend auf dem offiziellen kong image und override zu erstellen der Einstiegspunkt wie folgt:

#!/usr/bin/env bash 
set -e 

# Disabling nginx daemon mode 
export KONG_NGINX_DAEMON="off" 

# Setting default prefix (override any existing variable) 
export KONG_PREFIX="/usr/local/kong" 

# Prepare Kong prefix 
if [ "$1" = "/usr/local/openresty/nginx/sbin/nginx" ]; then 
    kong prepare -p "/usr/local/kong" 
fi 

#waiting for postgres 
until psql --host=$KONG_PG_HOST --username=$POLLING_USER $POLLING_DATABASE -w &>/dev/null 
do 
    echo "Waiting for PostgreSQL..." 
    sleep 1 
done 

echo "Postgres is ready, running the migrations..." 

kong migrations up 

echo "READY TO START UP KONG USING CMD" [email protected]; 

exec "[email protected]" 
2

Wir lösen dies mit einem einfachen TCP-Check auf Port 5432, ohne PG-Tools. Wir verwenden einfach wait-for-it.sh, und es funktioniert gut. Postgres öffnet den Port nicht, bis der Server tatsächlich bereit ist zu dienen, also ist das scheinbar in Ordnung.

Probe Dockerfile: https://github.com/apim-haufe-io/wicked.kong/blob/master/Dockerfile

Entsprechende Startskript (nur die letzte Zeile für dieses spezifische Problem interessant ist): https://github.com/apim-haufe-io/wicked.kong/blob/master/startup.sh

Snippet:

wait-for-it.sh -h $KONG_PG_HOST -p 5432 -t 30 -- kong start --run-migrations 

Warten Sie es: https://github.com/vishnubob/wait-for-it

Verwandte Themen