Woher weiß ich, wann mein Docker-Mysql-Container aktiv ist und mysql für die Abfrage bereit ist?
Ich bin die Bereitstellung von ein paar verschiedene docker-Container, mysql wird die erste. Ich möchte Skripts ausführen, sobald die Datenbank ist und gehen Sie zum Bau anderer Container. Das Skript wurde versagt, weil es versuchte zu laufen, wenn der entrypoint-Skript, das festlegt, mysql (von dieses offizielle mysql-container), war noch am laufen.
sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=MY_ROOT_PASS -p 3306:3306 -d mysql
[..] wait for mysql to be ready [..]
mysql -h 127.0.0.1 -P 3306 -u root --password=MY_ROOT_PASS < MY_SQL_SCRIPT.sql
Gibt es eine Möglichkeit zu warten, bis ein signal von einem entrypoiny mysql-setup-Skript Veredelung im inneren des docker-container? Bash schlafen scheint wie eine suboptimale Lösung.
EDIT: Ging für ein bash-Skript wie diesem. Nicht die eleganteste und ein bisschen brute-force, sondern funktioniert wie ein Charme. Vielleicht wird jemand finden, der nützlich ist.
OUTPUT="Can't connect"
while [[ $OUTPUT == *"Can't connect"* ]]
do
OUTPUT=$(mysql -h $APP_IP -P :$APP_PORT -u yyy --password=xxx < ./my_script.sql 2>&1)
done
InformationsquelleAutor der Frage haren | 2014-08-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die Installation von mysql-client-Paket, und verwenden Sie mysqladmin ping Ziel-server. Nützlich beim arbeiten mit mehreren docker-container. Kombinieren Sie mit schlafen und erstellen Sie ein einfaches wait-Schleife:
InformationsquelleAutor der Antwort flamemyst
Dieses kleine bash-Schleife wartet, mysql, offen zu sein, sollte nicht verlangen, alle zusätzlichen Pakete werden installiert:
InformationsquelleAutor der Antwort Adam
Das war mehr oder weniger erwähnt in den Kommentaren zu anderen Antworten, aber ich denke, es verdient es ist eigener Eintrag.
Zunächst starten Sie Ihre container in der folgenden Art und Weise:
Gibt es auch eine äquivalent im Dockerfile.
Mit diesem Befehl Ihre
docker ps
unddocker inspect
wird Ihnen zeigen, health status Ihrer container. Für mysql in allem hat diese Methode den Vorteilmysqladmin
verfügbar im inneren des Behältersso dass Sie nicht brauchen, um es zu installieren auf dem docker host.Dann kannst du einfach eine Schleife in einem bash-Skript zu warten, auf den status gesund zu werden. Das folgende bash-Skript wird erstellt, indem Dennis.
Nun können Sie dies in Ihrem Skript:
und das Skript wartet, bis der container in Betrieb ist. Das Skript wird beendet, wenn der container fehlerhaft ist, was möglich ist, wenn zum Beispiel die docker-host aus Speicher, so dass die mysql nicht genügend davon für sich selbst.
InformationsquelleAutor der Antwort Andrew Savinykh
Einige mal das problem mit dem port wird der port könnte öffnenaber die Datenbank ist noch nicht fertig.
Andere Lösungen erfordern, die Sie installiert haben die mysql o mysql-client - in Ihrem host-Maschine, aber wirklich, die Sie bereits haben es in den Docker-container, so dass ich lieber so etwas wie dieses:
InformationsquelleAutor der Antwort alejandropg
https://github.com/docker-library/mysql/blob/master/5.7/docker-entrypoint.sh
docker-entrypoint.sh nicht unterstützt die Zusammenführung angepasst .sql noch.
Ich denke, dass Sie ändern können docker-entrypoint.sh für die Zusammenführung der sql so kann es ausgeführt werden, sobald mysql-Instanz bereit ist.
InformationsquelleAutor der Antwort kmsheng
Ich hatte das gleiche Problem bei meinem Django-container versucht, die Verbindung der mysql-container direkt nach es gestartet. Ich löste es mit dem vishnubob ist wait-for.it.sh Skript. Seine ein shell-Skript, das wartet, bis eine IP-Adresse und einen host bereit ist, bevor Sie fortfahren. Hier ist das Beispiel, das ich für meine applicaction.
In diesem Skript, bitte ich um die mysql-container zu warten, maximal 90 Sekunden (es wird normalerweise ausgeführt, wenn Sie bereit) in den port 3306 (Standard mysql port) und der host-asigned von docker für meine MYSQL_CONTAINER_NAME. Das Skript mehr Variablen, aber für mw arbeitete mit diesen drei.
InformationsquelleAutor der Antwort Fabian Andres Merchan Jimenez
Auf Ihre
ENTRYPOINT
Skript, die Sie haben zu prüfen, wenn Sie einen gültigen MySQL-Verbindung ist oder nicht.So, in dieser Lösung, ich werde Ihnen zeigen, wie Sie ein PHP-Skript zu prüfen, ob eine MySQL-Container ist in der Lage, nehmen Sie Verbindung. Wenn Sie wissen wollen, warum ich denke, dass dies der bessere Ansatz ist, überprüfen Sie meine Kommentar -hier.
Datei
entrypoint.sh
Durch die Ausführung dieser, sind Sie im wesentlichen blockiert alle bootstrapping Logik der container, BIS Sie einen gültigen MySQL-Verbindung.
InformationsquelleAutor der Antwort Starx
Wenn der docker-container zu warten, für eine mysql-container basiert auf einem python-Bild (z.B. für eine Django-Anwendung)können Sie folgenden code verwenden.
Vorteile sind:
Code:
Verwendung:
wait-for-mysql-db.py
zum Beispiel), in Ihrer Anwendung Quellcode.startup.py
zum Beispiel), die erste führt den obigen code, und danach startet die Anwendung.command: ["python3", "startup.py"]
.Beachten Sie, dass diese Lösung ist für eine MySQL-Datenbank. Wirst du anpassen müssen, um es leicht für eine andere Datenbank.
InformationsquelleAutor der Antwort Sander Vanden Hautte