Ciò è dovuto a hostname
non risolto dall'host Docker. In Docker, le istanze mongo1
, mongo2
e mongo3
sono raggiungibili con quei nomi. Tuttavia, questi nomi non sono raggiungibili dall'host Docker. Questo è evidente da questa riga:
Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host
Il driver MongoDB tenterà di server discovery
da dato uno o più membri del set di repliche; troverà tutti gli altri nodi all'interno del set di repliche (tramite rs.conf
). Il problema qui è che il set di repliche è impostato con il nome mongo<N>
, il driver (eseguito nell'host Docker) non sarebbe in grado di risolvere questi nomi. Puoi confermarlo provando a eseguire il ping di mongo1
dall'host Docker.
Puoi provare a eseguire l'applicazione da un'altra istanza Docker che condivide la stessa rete Docker del set di repliche. In alternativa, modificare la rete Docker in quanto tale per consentire nomi host risolvibili.
AGGIORNAMENTO:
Riguardo al tuo commento sul perché usare mongo shell o PyMongo lavori.
Ciò è dovuto alla differenza nella modalità di connessione. Quando si specifica un singolo nodo, ad esempio mongodb://node1:27017
in shell o PyMongo, il rilevamento del server non viene effettuato. Tenterà invece di connettersi a quel singolo nodo (non come parte di un set di repliche). Il problema è che devi connetterti al nodo primario del set di repliche per scrivere (devi sapere quale). Se desideri connetterti come set di repliche, devi definire il nome del set di repliche.
In contrasto con il mongo-go-driver
, per impostazione predefinita eseguirà il rilevamento del server e tenterà di connettersi come set di repliche. Se desideri connetterti come un singolo nodo, devi specificare connect=direct
nell'URI di connessione. Vedi anche Esempio di connessione diretta