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!
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