我正在尝试将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
答案 0 :(得分:1)
错误本身提供了见解:
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_HOST
泊坞映像似乎未使用postgres
环境变量。因此,您只需在环境文件中进行更改即可:
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:
希望这可以帮助您