[英]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 服務運行。
localhost
postgres
docker 映像似乎沒有使用POSTGRES_HOST
環境變量。 所以你可以在環境文件中改變它:
POSTGRES_USER=testdbuser
POSTGRES_PASSWORD=testdbpass
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DB=testdb
為此,您需要創建一個簡單的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.