Ich habe viele Beispiele für die Erstellung von Docker-Containern für Rails-Anwendungen gesehen. In der Regel führen sie einen Rails-Server aus und haben einen CMD, der Migrationen/Setup ausführt und dann den Rails-Server aufruft.Ausführen von Migrationen mit Rails in einem Docker-Container mit mehreren Containerinstanzen
Wenn ich 5 dieser Container zur gleichen Zeit spawne, wie behandelt Rails mehrere Prozesse, die versuchen, die Migrationen zu initiieren? Ich kann sehen, Rails die aktuelle Schemaversion in dem allgemeinen Abfrage Protokoll überprüft hat (es ist eine MySQL-Datenbank):
SELECT `schema_migrations`.`version` FROM `schema_migrations`
Aber ich kann eine Race-Bedingung hier sehen, ob dies auf verschiedene Rails Instanzen zur gleichen Zeit passiert.
Wenn man bedenkt, dass DDL in MySQL nicht transaktional ist und ich keine Sperren im allgemeinen Abfrageprotokoll während der Ausführung von Migrationen sehe (abgesehen von den pro-Migration-Transaktionen), würde es scheinen, dass sie parallel ausgeführt werden eine schlechte Idee. In der Tat, wenn ich dies dreimal lokal abbringe, kann ich zwei der Schienen-Instanzen beim Versuch, eine Tabelle zu erstellen, abstürzen sehen, weil sie bereits existiert, während die dritte Schienen-Instanz die Migrationen glücklicherweise abschließt. Wenn dies eine Migration wäre, die etwas in die Datenbank einfügt, wäre das ziemlich unsicher.
Ist es dann eine bessere Idee, einen einzelnen Container auszuführen, der Migrationen/Setup ausführt und dann zum Beispiel eine Unicorn-Instanz erzeugt, die wiederum mehrere Rails-Workers hervorbringt?
Sollte ich N Rails Container und einen "Migrationscontainer" generieren, der die Migration ausführt, wird die Migration beendet?
Gibt es eine bessere Option?
Dies scheint relevant http://blog.carbonfive.com/2015/03/17/docker-rails-docker-compose-gether-in-your-development-workflow/ –
@MaxWilliams aus dem Aussehen seiner Dockerfile es ist ein gutes Beispiel dafür, wie man das Problem unwissentlich verursacht, enthält aber keine Lösung. Sein Beispiel funktioniert gut zum Testen (aber vielleicht langsam). Ich kann nicht glauben, dass jeder einen einzigen Schienenserver in der Produktion betreibt! –
Hmm yeah du hast Recht, sorry:/Es ist definitiv nicht der Fall, dass jeder einen einzigen Rails-Server in Produktion hat! Zum Beispiel haben wir drei Boxen, jede eine Amazon-Instanz, mit einigen freigegebenen Ordnern und jeder läuft 12 Monster, wir haben tatsächlich 36 Schienen Server über 3 Boxen. Wir verwenden docker tho nicht :) –