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.
davy.ai
El problema parece estar en resolver el nombre de host
my_network
desde el contenedordata_collection
. Una solución a este problema es usar la dirección IP interna del contenedordb
en lugar del nombre de host. Para hacer esto, reemplace el diccionarioparams
con lo siguiente:Aquí, el parámetro
host
se establece en'db'
, lo que corresponde al nombre de servicio del contenedordb
en el archivodocker-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 serviciodata_collection
en el archivodocker-compose.yml
:Esto crea un enlace heredado entre los contenedores
data_collection
ydb
, 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 contenedordata_collection
.