2016-09-13 5 views
4

Ich habe eine Anwendung, die aus einfachen Knoten App und Mongo db besteht. Ich frage mich, wie könnte ich Datenbank-Migrationen im Docker-Schwarm-Modus ausführen?Datenbankmigrationen im Docker-Schwarm-Modus

Ohne Schwarm-Modus I Migrationen laufen, indem man zuerst die alte Version von Anwendung zu stoppen, läuft einmaligen Migrationsbefehl mit der neuen Version der Anwendung und dann schließlich eine neue Version der App starten:

# Setup is roughly the following 
$ docker network create appnet 
$ docker run -d --name db --net appnet db:1 
$ docker run -d --name app --net appnet -p 80:80 app:1 

# Update process 
$ docker stop app && docker rm app 
$ docker run --rm --net appnet app:2 npm run migrate 
$ docker run -d --name app --net appnet -p 80:80 app:2 

Jetzt I‘ Ich teste das Setup im Docker-Schwarm-Modus, so dass ich problemlos app skalieren konnte. Das Problem ist, dass in Schwarm Modus eine nicht-Container in Schwarm Netzwerk beginnen und somit kann ich die db erreichen Migrationen laufen:

$ docker network ls 
NETWORK ID   NAME    DRIVER    SCOPE 
6jtmtihmrcjl  appnet    overlay    swarm 

# Trying to replicate the manual migration process in swarm mode 
$ docker service scale app=0 
$ docker run --rm --net appnet app:2 npm run migrate 
docker: Error response from daemon: swarm-scoped network (appnet) is not compatible with `docker create` or `docker run`. This network can only be used by a docker service. 

Ich will nicht entweder den Migrationsbefehl während app Start ausgeführt wird , da möglicherweise mehrere Instanzen gestartet werden und die Datenbank möglicherweise beschädigt wird. Automatische Migrationen sind gruselig, daher möchte ich sie um jeden Preis vermeiden.

Haben Sie eine Idee, wie Sie den manuellen Migrationsschritt im Docker-Schwarm-Modus implementieren?

bearbeiten

fand ich einen schmutzig Hack aus, der den ursprünglichen Workflow nachbilden können. Idee ist, einen neuen Dienst mit einem benutzerdefinierten Befehl zu erstellen und ihn zu entfernen, wenn eine seiner Aufgaben beendet ist. Das ist alles andere als angenehm, bessere Alternativen sind mehr als willkommen!

+1

Dieser Anwendungsfall kommt immer bis laufen. Es gibt ein Github-Problem mit der Diskussion [hier] (https://github.com/docker/docker/issues/23880). Ich benutze persönlich einen generischen "Wartungs" -Dienst und rufe "docker service update ..." auf, um neue Aufgaben (Container) für die angeforderte Arbeit zu erzeugen. – Alkaline

Antwort

3

Ich glaube, Sie können dieses Problem beheben, indem Sie Ihr Overlay-Netzwerk, appnet, anbindbar machen. Dies kann mit folgendem Befehl erreicht werden:

docker network create --driver overlay --attachable appnet 

Dies sollte den Schwarm-scoped Netzwerkfehler beheben und und lassen Sie Migrationen

+0

Ja! Docker 1.13 brachte uns dieses Flag "--attachable", mit dem einzelne Container an das Schwarm-Overlay-Netzwerk angeschlossen werden können. Süss! Ich habe es versucht und es funktioniert wie erwartet. – ronkot

0

Das ist in der Tat knifflige Situation, obwohl ich denke, dass die Migration während des Starts das letzte Stück des Puzzles sein könnte.

So wie ich es jetzt tun (wenn auch nicht sehr elegant, es funktioniert), wird mit einem message queue (Ich verwende redis), auf app Start wird es eine Nachricht an einen der queue senden, sie zu informieren, dass Der Task migration muss ausgeführt werden. Am anderen Ende der queue habe ich eine listener app, die die queue verarbeiten und die migration Aufgabe ausführen wird. Die Migrationsaufgabe würde nur einmal ausgeführt werden, da nur eine einzige Instanz von listener diese sequenziell ausführt. Also verwende ich im Wesentlichen nur die queue & die listener app um sicherzustellen, dass die migration Aufgabe nur einmal ausgeführt wird.

+0

Schwierige Situation, in der Tat :) Vielleicht wäre Ihre Lösung der Weg für jetzt, wenn ich diese Art von Infrastruktur bereits vorhanden hätte. Aber in meinem Fall ist es nur eine zu schwere Lösung, um einige zufällige Verwaltungsbefehle gegen db zu starten. Ich habe meine Frage bearbeitet und einen schmutzigen Weg hinzugefügt, um zufällige Befehle im Schwarm-Netzwerk auszuführen. Diese Lösung ist noch lange nicht akzeptabel, aber es ist das Beste, was ich jetzt in meinen Händen habe.Danke für deinen Beitrag! – ronkot

Verwandte Themen