2017-05-10 2 views
1

Ich bin daran interessiert, mit wait-for-it einen Dienst in Docker-Compose warten auf einen anderen, mit Bildern basierend auf der Alpine Linux-Distribution.Wie benutzt man ein Bash-Skript in Alpine Linux?

Allerdings, wenn ich die wait-for-it Repository klonen und es die folgenden Dockerfile hinzufügen,

FROM alpine 
RUN apk --update add bash 
COPY wait-for-it.sh wait-for-it.sh 
CMD ["./wait-for-it.sh", "www.google.com:80"] 

Dann baue ich es docker build --tag waitforit . von docker run waitforit gefolgt, aber ich bekomme diese Fehlermeldung:

timeout: can't execute '15': No such file or directory 
wait-for-it.sh: timeout occurred after waiting 15 seconds for www.google.com:80 

Im Gegensatz dazu sehe ich das, wenn ich diesen Befehl auf meinem (Ubuntu 16.04 LTS) Computer starte:

wait-for-it.sh: waiting 15 seconds for www.google.com:80 
wait-for-it.sh: www.google.com:80 is available after 0 seconds 

Es scheint, dass das Bash-Skript nicht im Alpine-Container funktioniert, wie es auf meinem lokalen Ubuntu-Rechner ist. Wie kann ich das beheben?

+2

Was ist die ausführbare Datei von wait-for-it.sh? Siehe die erste Zeile. #!/bin/bash oder sh? – Robert

+0

Scheint, als ob dein Shell-Skript einen Fehler enthält. Bitte fügen Sie das Skript ein – n2o

Antwort

2

Das wait-for-it Skript ist nicht sh-konform, also müssten Sie bash in Ihrem alpinen Bild installieren.

Kann ich jedoch empfehlen, "Hacks" zu vermeiden und statt dessen HEALTHCHECK zu verwenden?

Zum Beispiel so aussehen würde, um gesund zu sein für den anderen einen Dienst warten:

services: 
    my_service: 
    image: something 
    healthcheck: 
     test: nc -z 3306 

    other_service 
    depends_on: 
    my_service: 
     condition: service_healthy 

Bitte beachten Sie, dass dies nur v2 compose Datei, arbeiten mit nicht v3

+1

In der Tat fand ich später [wait-for] (https://github.com/Eficode/wait-for), welches auf 'wait-for-it' basiert, aber' alpine' konform ist. Wie für [HEALTHCHECK] (https://docs.docker.com/engine/reference/builder/#healthcheck), was ich aus der Dokumentation erkennen kann, läuft es __interval__ Sekunden nach dem Start des Containers, und dann wieder __interval__ Sekunden nach jedem vorherige Überprüfung ist abgeschlossen. In meinem Fall würde ich jedoch den Check nur einmal ausführen, bevor ich die eigentliche App starte, und blockieren, bis sie übergeben wird. –

1

Wenn Sie hier einsehen Da ich nach Lösungen für den Fehler "Keine solche Datei oder Verzeichnis" gesucht habe, indem ich Scripts in Alpine ausgeführt habe, ist es eine andere Sache, zu überprüfen, ob das Skript Zeilenenden hat.

In meinem Fall habe ich das Skript in Windows gespeichert und fügte es in das Docker-Bild und es gab die gleiche wenig hilfreiche Fehlermeldung.