MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Erreur de sélection de serveur Docker et mongo-go-driver

Cela est dû à un hostname non résolu de l'hôte Docker. Dans Docker, les instances mongo1 , mongo2 , et mongo3 sont accessibles par ces noms. Cependant, ces noms ne sont pas accessibles depuis l'hôte Docker. Ceci est évident par cette ligne :

Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host

Le pilote MongoDB tentera de server discovery à partir d'un ou plusieurs membres du jeu de réplicas donnés ; il trouvera tous les autres nœuds dans le jeu de répliques (via rs.conf ). Le problème ici est que le jeu de répliques est défini avec le nom mongo<N> , le pilote (exécuté sur l'hôte Docker) ne serait pas en mesure de résoudre ces noms. Vous pouvez le confirmer en essayant de faire un ping mongo1 de l'hôte Docker.

Vous pouvez soit essayer d'exécuter l'application à partir d'une autre instance Docker partageant le même réseau Docker que le jeu de répliques. Ou modifiez la mise en réseau Docker en tant que telle pour autoriser les noms d'hôte résolubles.

MISE À JOUR :

Concernant votre commentaire sur pourquoi utiliser mongo shell ou PyMongo œuvres.

Cela est dû à la différence de mode de connexion. Lors de la spécification d'un seul nœud, c'est-à-dire mongodb://node1:27017 en shell ou PyMongo, la découverte de serveur n'est pas effectuée. Au lieu de cela, il tentera de se connecter à ce nœud unique (et non dans le cadre d'un jeu de répliques). Le hic, c'est que vous devez vous connecter au nœud principal du jeu de répliques pour écrire (vous devez savoir lequel). Si vous souhaitez vous connecter en tant que jeu de répliques, vous devez définir le nom du jeu de répliques.

Contrairement au mongo-go-driver , par défaut, il effectuerait la découverte du serveur et tenterait de se connecter en tant que jeu de réplicas. Si vous souhaitez vous connecter en tant que nœud unique, vous devez spécifier connect=direct dans l'URI de connexion. Voir aussi Exemple Connect Direct