es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Conéctese al contenedor de postgres desde otro contenedor en ejecución.

Estoy teniendo dificultades para conectarme a un contenedor activo con una base de datos postgres desde otro contenedor. Puedo conectarme cuando se ejecuta localmente, pero sospecho que hay algún problema de red que estoy pasando por alto al intentar conectarme desde otro contenedor. El error específico que estoy viendo actualmente es psycopg2.OperationalError: no se pudo traducir el nombre del host "my_network" a dirección: Falla temporal en la resolución del nombre.

Aquí está mi archivo docker-compose:

version: '3'
services:
  data_collection:
    build: ./docker/data_collection
    ports:
      - "8888:8888"
      - "6006:6006"
      - "8000:8000"
    networks:
      - my_network
    depends_on:
      - db
  db:
    image: 'postgres:13.2-alpine'
    ports: 
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=mypassword
      - POSTGRES_DB=spotify
    volumes:
      - db-data:/var/lib/postgresql/data # persist data even if container shuts down
    networks:
      - my_network
volumes:
  db-data:
networks:
  my_network:

Luego ingreso una shell en mi contenedor data_collection e intento conectarme leyendo esos parámetros en una variable params, que se pasa así:

import psycopg2

params = dict(host='my_network', database='spotify', user='postgres', password='mypassword', port='5432')
conn = psycopg2.connect(**params)

Sin embargo, al ejecutar esto localmente y reemplazar el host anterior con localhost, funciona como se espera.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en resolver el nombre de host my_network desde el contenedor data_collection. Una solución a este problema es usar la dirección IP interna del contenedor db en lugar del nombre de host. Para hacer esto, reemplace el diccionario params con lo siguiente:

    params = dict(host='db', database='spotify', user='postgres', password='mypassword', port='5432')
    

    Aquí, el parámetro host se establece en 'db', lo que corresponde al nombre de servicio del contenedor db en el archivo docker-compose.yml. Docker Compose configura un servicio DNS que resuelve este nombre a la dirección IP interna del contenedor correspondiente.

    Como alternativa, también se puede intentar agregar el parámetro links al servicio data_collection en el archivo docker-compose.yml:

    services:
      data_collection:
        build: ./docker/data_collection
        ports:
          - "8888:8888"
          - "6006:6006"
          - "8000:8000"
        networks:
          - my_network
        depends_on:
          - db
        links:  # agregar esta línea
          - db  # agregar esta línea
      ...
    

    Esto crea un enlace heredado entre los contenedores data_collection y db, lo que permite que el primero haga referencia al último por su nombre de host.

    Después de hacer estos cambios, reconstruya y vuelva a implementar los contenedores usando docker-compose up --build e intente conectarse nuevamente desde el contenedor data_collection.

Comments are closed.