簡體   English   中英

無法從 Flask 連接到 Postgres Docker 容器

[英]Unable to Connect from Flask to Postgres Docker Container

我正在嘗試將 python flask 應用程序連接到 postgres docker 容器內的數據庫。

我有以下database.conf

POSTGRES_USER=testdbuser
POSTGRES_PASSWORD=testdbpass
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_DB=testdb

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}'

最后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:

docker-compose up --build -d -> export $(xargs < database.conf) -> export FLASK_APP=app.py -> flask run后我得到的錯誤是:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "postgres" to address: nodename nor servname provided, or not known

錯誤本身提供了洞察力:

could not translate host name "postgres" to address: nodename nor servname provided, or not known

DNS 或您的本地網絡中不存在主機postgres SQLAlchemy無法連接到它。 這在邏輯上是這種情況,因為您創建了一個 docker 容器並將端口5432轉發到本地計算機。

您可以選擇 2 個選項 - 使用localhost地址從 flask 應用程序連接或將 flask 應用程序作為 docker-compose 服務運行。

選項 1 - 使用localhost

postgres docker 映像似乎沒有使用POSTGRES_HOST環境變量。 所以你可以在環境文件中改變它:

POSTGRES_USER=testdbuser
POSTGRES_PASSWORD=testdbpass
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DB=testdb

選項 2 - 使用 docker-compose 運行 flask

為此,您需要創建一個簡單的Dockerfile並將 flask 應用程序添加到docker-compose.yml文件中。

我建議Dockerfile像這樣簡單:

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

然后您需要將其添加到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:

希望這能讓你繼續前進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM