Estoy tratando de conectar una aplicación de matraz de python a una base de datos dentro de un contenedor acoplable de postgres.
Tengo la siguiente database.conf de datos.conf:
POSTGRES_USER=testdbuser POSTGRES_PASSWORD=testdbpass POSTGRES_HOST=postgres POSTGRES_PORT=5432 POSTGRES_DB=testdb y config.py :
import os user = os.environ['POSTGRES_USER'] password = os.environ['POSTGRES_PASSWORD'] host = os.environ['POSTGRES_HOST'] database = os.environ['POSTGRES_DB'] port = os.environ['POSTGRES_PORT'] DATABASE_CONNECTION_URI = f'postgresql+psycopg2://{user}:{password}@{host}:{port}/{database}' y finalmente docker-compose.yml :
version: '3.5' services: database: container_name: postgres-test image: postgres:latest env_file: database.conf ports: - 5432:5432 volumes: - postgres-data:/var/lib/postgresql/data volumes: postgres-data: El error que recibo después docker-compose up --build -d -> export $(xargs < database.conf) -> export FLASK_APP=app.py -> Flask flask run es:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "postgres" to address: nodename nor servname provided, or not knownEl error en sí da una idea:
could not translate host name "postgres" to address: nodename nor servname provided, or not known El host postgres no existe en DNS ni en su red local. SQLAlchemy no puede conectarse a él. Este es el caso lógico, ya que creó un contenedor docker y reenvió el puerto 5432 a su máquina local.
Hay 2 opciones que puede tomar: usar la dirección localhost para conectarse desde la aplicación del matraz o ejecutar la aplicación del matraz como un servicio de redacción de ventana acoplable.
localhost La variable de entorno POSTGRES_HOST no parece ser utilizada por la imagen de la ventana acoplable de postgres . Así que puedes cambiar esto en el archivo de entorno:
POSTGRES_USER=testdbuser POSTGRES_PASSWORD=testdbpass POSTGRES_HOST=localhost POSTGRES_PORT=5432 POSTGRES_DB=testdb Para esto, deberá crear un Dockerfile simple y agregar la aplicación del matraz al archivo docker-compose.yml .
Sugiero algo simple para el Dockerfile así:
FROM python COPY . /app # How you install your python packages may differ RUN pip install -r /app/requirements.txt # Ensure the path here is correct ENV FLASK_APP /app/app.py CMD flask run Luego deberá agregar esto al archivo docker-compose.yml :
version: '3.5' services: database: container_name: postgres-test image: postgres:latest env_file: database.conf ports: - 5432:5432 volumes: - postgres-data:/var/lib/postgresql/data flask: build: context: . dockerfile: Dockerfile environment: # or use env_file as you did above POSTGRES_USER: testdbuser POSTGRES_PASSWORD: testdbpass POSTGRES_HOST: database # This is the name of the database service in this file above POSTGRES_PORT: 5432 POSTGRES_DB: testdb depends_on: - database volumes: postgres-data:Espero que esto te ayude.