python - 无法从 Flask 连接到 Postgres Docker 容器
问题描述
我正在尝试将 python 烧瓶应用程序连接到 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
该主机postgres
在 DNS 或您的本地网络中不存在。SQLAlchemy
无法连接到它。这在逻辑上就是这种情况,因为您创建了一个 docker 容器并将端口转发5432
到本地计算机。
您可以选择 2 个选项 - 使用该localhost
地址从烧瓶应用程序连接或将烧瓶应用程序作为 docker-compose 服务运行。
选项 1 - 使用localhost
docker镜像POSTGRES_HOST
似乎没有使用环境变量。postgres
所以你可以在环境文件中改变它:
POSTGRES_USER=testdbuser
POSTGRES_PASSWORD=testdbpass
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DB=testdb
选项 2 - 使用 docker-compose 运行烧瓶
为此,您需要创建一个简单Dockerfile
的烧瓶应用程序并将其添加到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:
希望这能让你继续前进。
推荐阅读
- rust - 生成图像的快速 2D 绘图
- javascript - 在按钮单击事件上模拟击键的问题
- html - 如何使用 selenium 在跨度内定位字符串
- math - 公钥是如何从比特币中的私钥推导出来的?
- java - JAVA:哪个对象在多线程中调用 run() 方法
- python - django.db.utils.ProgrammingError:关系“database_class”不存在
- r - R studio 的版本与 shell 不同
- typescript - 从打字稿文件中的vue文件导入类
- c# - 如果文本框为空错误如何实现代码
- python - pyautogui.pixel 和 pyautogui.mouseInfo 给我一个错误