Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

961
Vistas
Docker y mongo-go-driver "error de selección de servidor"

Estaba creando un conjunto de réplicas de MongoDB usando Docker y puedo acceder usando la consola o Robo3T y ejecutar cualquier consulta.

Los contenedores aparecen así:

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES efe6ae03323d mongo "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 0.0.0.0:30001->27017/tcp mongo1 57d2701c8a43 mongo "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 0.0.0.0:30002->27017/tcp mongo2 7553966b9ff5 mongo "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 0.0.0.0:30003->27017/tcp mongo3

El problema es un error cuando trato de hacer ping usando el controlador mongo-go (lo intenté con la versión 1.0.0 y 1.0.2)

 // Create MongoDB client client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:30001")) if err != nil { t.Fatalf("Exit error: %v", err) } ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() err = client.Connect(ctx) if err != nil { t.Fatalf("Exit error: %v", err) } ctx, cancel = context.WithTimeout(context.Background(), time.Minute) defer cancel() // Ping err = client.Ping(ctx, readpref.Primary()) if err != nil { t.Fatalf("Exit error Ping: %v", err) }

el error que arroja la llamada Ping es el siguiente:

 Exit error Ping: server selection error: server selection timeout current topology: Type: ReplicaSetNoPrimary Servers: Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host Addr: mongo3:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo3: no such host Addr: mongo1:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo1: no such host

¡Gracias por todo el apoyo!

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Esto se debe a un nombre de host no resuelto del hostname de Docker. En Docker, las instancias mongo1 , mongo2 y mongo3 son accesibles por esos nombres. Sin embargo, estos nombres no son accesibles desde el host de Docker. Esto es evidente por esta línea:

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

El controlador MongoDB intentará server discovery a partir de un miembro o miembros del conjunto de réplicas dados; encontrará todos los demás nodos dentro del conjunto de réplicas (a través de rs.conf ). El problema aquí es que el conjunto de réplicas está configurado con el nombre mongo<N> , el controlador (que se ejecuta en el host de Docker) no podría resolver estos nombres. Puede confirmar esto intentando hacer ping a mongo1 desde el host de Docker.

Puede intentar ejecutar la aplicación desde otra instancia de Docker que comparta la misma red de Docker que el conjunto de réplicas. O bien, modifique la red de Docker como tal para permitir nombres de host resolubles.

ACTUALIZAR:

Con respecto a su comentario sobre por qué funciona el uso de mongo shell o PyMongo .

Esto se debe a la diferencia en el modo de conexión. Cuando se especifica un solo nodo, es decir, mongodb://node1:27017 en shell o PyMongo, no se realiza la detección del servidor. En su lugar, intentará conectarse a ese único nodo (no como parte de un conjunto de réplicas). El problema es que debe conectarse al nodo principal del conjunto de réplicas para escribir (debe saber cuál). Si desea conectarse como un conjunto de réplicas, debe definir el nombre del conjunto de réplicas.

A diferencia de mongo-go-driver , de forma predeterminada realizaría la detección del servidor e intentaría conectarse como un conjunto de réplicas. Si desea conectarse como un solo nodo, debe especificar connect=direct en el URI de conexión. Véase también Ejemplo Connect Direct

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda