2016-03-18 11 views
1

Ich habe zwei Maschinen Hosta und HostB mit Konsul und Docker-Daemon richtig so konfiguriert ist, dass ich docker network create -d overlay sharednetWie kann man während der Erstellung eines Docker-Overlay-Netzwerks Race-Condition vermeiden?

verwenden kann ich eine TestScript.sh zu überprüfen, ob ein Netzwerk vorhanden ist und wenn das Netzwerk nicht erstellen. Und dieses Skript ist sowohl auf HostA als auch auf HostB verfügbar. Ich habe auch eine MasterScript.sh nur auf A, die im Grunde nur TestScript.sh auf jeder Maschine aufrufen. Nachdem ich meine MasterScript.sh ausgeführt habe, sehe ich ein überraschendes Ergebnis, zwei Netzwerke mit dem gleichen Namen wurden erstellt !!! Dies ist wohl ein Docker-Synchronisationsproblem.

[HostA]# docker network ls 
NETWORK ID   NAME     DRIVER 
ad492bba9efa  sharednet   overlay 
ba53d4e7b739  sharednet   overlay 

[HostB]# docker network ls 
NETWORK ID   NAME     DRIVER 
ad492bba9efa  sharednet   overlay 
ba53d4e7b739  sharednet   overlay 

Das erwartete Verhalten ist, dass wenn ich ein Netzwerk testnw auf Hosta erstellt, dann auf HostB ich so etwas wie dieses

[HostB]# docker network ls 
68994f95cd67  testnw    overlay 
[HostB]# docker network create -d overlay testnw 
Error response from daemon: network with name testnw already exists 

Aufgrund einiger Einschränkungen sehen sollte ich nicht die MasterScript.sh ändern kann, aber ich kann Ändere meine TestScript.sh. Also die Frage ist, ist es mir möglich, diese Rassenbedingung unter dieser Einschränkung zu lösen?

+0

verfolgt wird ich mit Ihrer Erwartung voll und ganz zustimmen; Das sieht wie ein Fehler aus. Warum überprüfen Sie die Netzwerke auf allen Hosts an erster Stelle? Wäre es nicht ausreichend, dies auf einem Host zu tun? – morxa

+0

@morxa Auf jeder Maschine habe ich eine Kopie von 'TestScript.sh', die lokale Docker-Container verwaltet und sie an entsprechende Netzwerke anfügt. Wenn das Netzwerk nicht vorhanden ist, erstellt das Skript nur das Netzwerk und hängt den Container an das Netzwerk an. Da 'TestScript.sh' vollständig in der Natur verteilt ist und von Entwurf aus nicht miteinander kommunizieren kann, weiß TestScript.sh auf HostA nicht, ob TestScript.sh auf HostB den Befehl create ausgegeben hat oder nicht. Daher muss ich mich auf den Docker-Daemon verlassen, um meinen Netzwerk-Erstellungsbefehl zu synchronisieren. – cookieisaac

+0

Welche Docker-Version verwenden Sie? – morxa

Antwort

Verwandte Themen