web-dev-qa-db-fra.com

Pilote MongoDB Go «Docking Error Timeout» avec Docker

Je travaille sur un programme de démarrage très basique (je pensais) dans Go en utilisant MongoDB et Docker. Essayer de les maîtriser avant de commencer à les utiliser au travail. J'ai mon MongoDB en cours d'exécution dans un conteneur Docker, en utilisant simplement mon hôte local, en utilisant l'image Docker officielle. Cela fonctionne bien, je peux me connecter via MongoDB Compass et modifier la base de données.

Ma tâche suivante consistait à créer un conteneur Docker distinct capable de lire et d'écrire dans la base de données. J'utilise MongoDB-Go-Driver ( https://godoc.org/github.com/mongodb/mongo-go-driver/mongo ) pour cela car mgo n'est plus maintenu.

Ceci est mon code, je suis juste en train de suivre les nombreux tutoriels en ligne pour établir une connexion simple, puis cingler la base de données pour assurer la connectivité.

client, err := mongo.Connect("mongodb://localhost:27017")

if err != nil {
    log.Fatal("error ", err)
}

// Check the connection
err = client.Ping(context.TODO(), nil)

if err != nil {
    log.Fatal("error2 ", err)
}

fmt.Println("Connected to MongoDB!")

Il échoue toujours lors de toute opération sur la base de données (Find, FindOne, Ping, etc.) avec error2 server selection timeout

Ceci est mon fichier docker-compose que j'exécute.

version: "3"

services:
  datastore:
    image: mongo
    ports: 
      - "27017:27017"
    networks: 
      - maccaptionNet
    volumes: 
      - .:/go/src/maccaption_microservice/dbdata
  jobservice:
    image: jobservicemaccaption:1.0
    networks:
      - maccaptionNet
    depends_on:
      - "datastore"


networks: 
  maccaptionNet:
    driver: bridge

Je suis tout nouveau sur MongoDB et, après des heures de recherche, je n'ai fait aucun progrès à ce sujet. J'ai lu https://docs.mongodb.com/manual/core/read-preference-mechanics/https://docs.mongodb.com/manual/replication/

Quelqu'un peut-il m'orienter dans cette direction? Je n'ai pas pu trouver grand-chose sur cette question spécifique.

Merci!

6
henleyhoudini

Si vous vous connectez à un docker à partir d'un autre (comme c'est écrit dans votre docker-compose fichier, et en utilisant le mode réseau bridge, vous devez changer votre localhost en nom d'hôte, comme datastore

client, err := mongo.Connect("mongodb://datastore:27017")

Lorsque votre script go utilise localhost, il s'attend à ce que la base de données se trouve dans le même docker

2
grapes

D'une manière ou d'une autre, j'ai résolu ce problème d'une manière différente: en changeant ports de "27018:27017" à "27017:27017". IDK pourquoi cela aide. Peut-être que si Mongo ne voit pas le port par défaut, il pense qu'il y a un cluster de nœuds de Mongo.

0
VadimFilin

Je pense que ma réponse n'est peut-être pas liée, mais quand même, j'obtenais la même erreur et c'était parce que mon adresse IP n'était pas répertoriée dans l'onglet Liste blanche IP de l'atlas MongoDB, alors assurez-vous d'avoir votre adresse IP là avant d'essayer de vous connecter.

0
Anurag Sanghvi

J'ai eu le même problème, mais j'ai trouvé un autre moyen de résoudre ce problème. Vous pouvez simplement passer les paramètres réseau lors de l'exécution de l'image docker et de cette manière, le docker pointe pour corriger l'hôte local.

docker run --network="Host" ....

Source pour cette solution

0
hyperloopfan