2017-06-05 1 views
2

Ich habe einen Python-Docker-Container, der warten muss, bis ein anderer Container (Postgres-Server) das Setup beendet hat. Ich habe den Standard wait-for-it.sh ausprobiert, aber einige Befehle waren nicht enthalten. Ich versuchte einen Grundschlaf (wieder in einer SH-Datei), aber jetzt meldet es exec: 300: not found, wenn ich versuche, den Befehl, auf den ich warte, endlich auszuführen.Ausführen von wait-for-it.sh im Python-Docker-Container

Wie kann ich dieses Problem umgehen (vorzugsweise ohne das Bild zu verändern, oder um ein Bild zu verlängern.) Erhalten

Ich weiß, ich könnte auch nur einen Python-Skript ausgeführt, sondern im Idealfall würde Ich mag WAIT verwenden for-it.sh wartet darauf, dass der Server aufleuchtet und nicht nur schläft.

Dockerfile (für Stuffer):

FROM python:2.7.13 

ADD ./stuff/bin /usr/local/bin/ 
ADD ./stuff /usr/local/stuff 
WORKDIR /usr/local/bin 

COPY requirements.txt /opt/updater/requirements.txt 
COPY internal_requirements.txt /opt/stuff/internal_requirements.txt 

RUN pip install -r /opt/stuff/requirements.txt 
RUN pip install -r /opt/stuff/other_requirements.txt 

Docker-compose.yml:

version: '3' 
services: 
    local_db: 
    build: ./local_db 
    ports: 
    - "localhost:5432:5432" 

    stuffer: 
    build: ./ 
    depends_on: 
    - local_db 
    command: ["./wait-for-postgres.sh", "-t", "300", "localhost:5432", "--", "python", "./stuffing.py", "--file", "./afile"] 

Script ich verwenden möchte (aber nicht kann, weil keine psql oder exec):

#!/bin/bash 
# wait-for-postgres.sh 

set -e 

host="$1" 
shift 
cmd="[email protected]" 

until psql -h "$host" -U "postgres" -c '\l'; do >&2 echo "Postgres is unavailable - sleeping" 
    sleep 1 
done 

>&2 echo "Postgres is up - executing command" 
exec $cmd 
+0

Können Sie mir Dockerfile und Einstiegspunkt bitte zeigen? –

+0

Was ist der beste Weg, Bash-Befehle nach Bedarf zu installieren. Ich weiß, dass ich theoretisch postgres im python Bild installieren konnte, um psql zu haben, aber exec ist nicht etwas, das ich installieren sollte. –

+2

versuchen, die Zeile 'command: [" ./wait-for-postgres.sh "," -t "," 300 "," localhost: 5432 "," - "," python "," ./stuffing. py "," --file "," ./afile "]' zu 'command: [" ./wait-for-postgres.sh "," localhost: 5432 "," -t "," 300 "," - " - "," python "," ./stuffing.py "," --file "," ./afile "]' warten auf es erwartet, dass das erste Argument ein Hostname sein wird: Port –

Antwort

2

Sergey Kommentar. Ich hatte falsche Argumentation. Dieses Problem hatte nichts mit Docker und allem zu tun, was mit meiner Unfähigkeit zu lesen zu tun hatte.

0

machte ich ein Beispiel, damit Sie es sehen können, arbeiten:

https://github.com/nitzap/wait-for-postgres

Auf der anderen Seite können Sie auch Fehler haben in der Ausführung des Skripts zu überprüfen, ob der Dienst funktioniert. Sie sollten nicht als localhost .... bezeichnet werden, da dies innerhalb der Kontexte von Containern liegt, wenn Sie auf einen anderen Container verweisen möchten, muss der Name des Services angegeben werden.

+0

Können Sie etwas mehr dazu erklären? Mein Ziel ist, dass der Postgres-Container an localhost auf dem Host-Rechner gebunden wird und der zweite Container sich mit ihm verbindet. (Der Zweck dieser Container ist eine standardmäßige lokale Dev-DB-Konfiguration). –

+0

Wenn Sie das Projekt sehen können, erwartet der Anwendungscontainer, dass der postgres-Container bereit ist. Wenn Sie die Base nun separat verwenden möchten, wird der Port auch so veröffentlicht, als wäre er lokal. – German

Verwandte Themen