Dies liegt an einem nicht aufgelösten hostname
vom Docker-Host. In Docker sind die Instanzen mongo1
, mongo2
und mongo3
sind unter diesen Namen erreichbar. Diese Namen sind jedoch vom Docker-Host aus nicht erreichbar. Dies wird durch diese Zeile deutlich:
Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host
Der MongoDB-Treiber versucht die server discovery
von einem oder mehreren Replikat-Set-Mitgliedern; Es findet alle anderen Knoten innerhalb des Replikatsatzes (über rs.conf
). Das Problem hier ist, dass der Replikatsatz mit dem Namen mongo<N>
festgelegt ist , wäre der Treiber (der im Docker-Host ausgeführt wird) nicht in der Lage, diese Namen aufzulösen. Sie können dies bestätigen, indem Sie versuchen, mongo1
zu pingen vom Docker-Host.
Sie können entweder versuchen, die Anwendung von einer anderen Docker-Instanz aus auszuführen, die dasselbe Docker-Netzwerk wie der Replikatsatz nutzt. Oder ändern Sie das Docker-Netzwerk als solches, um auflösbare Hostnamen zuzulassen.
AKTUALISIEREN:
In Bezug auf Ihren Kommentar, warum Sie Mongo verwenden Shell oder PyMongo funktioniert.
Dies ist auf den Unterschied im Verbindungsmodus zurückzuführen. Bei Angabe eines einzelnen Knotens, d. h. mongodb://node1:27017
in Shell oder PyMongo wird keine Servererkennung durchgeführt. Stattdessen wird versucht, eine Verbindung zu diesem einzelnen Knoten herzustellen (nicht als Teil eines Replikatsatzes). Der Haken ist, dass Sie zum Schreiben eine Verbindung zum primären Knoten des Replikatsatzes herstellen müssen (Sie müssen wissen, welcher). Wenn Sie sich als Replica-Set verbinden möchten, müssen Sie den Replica-Set-Namen definieren.
Im Gegensatz zum mongo-go-driver
, würde es standardmäßig eine Servererkennung durchführen und versuchen, eine Verbindung als Replikatgruppe herzustellen. Wenn Sie sich als einzelner Knoten verbinden möchten, müssen Sie connect=direct
angeben in der Verbindungs-URI. Siehe auch Beispiel Connect Direct