Postgresql 从容器内的烧瓶应用程序连接到postgres容器
我有我的烧瓶appPostgresql 从容器内的烧瓶应用程序连接到postgres容器,postgresql,docker,flask-sqlalchemy,Postgresql,Docker,Flask Sqlalchemy,我有我的烧瓶appapp.py: from flask import Flask from flask_sqlalchemy import SQLAlchemy APP = Flask(__name__) DB = SQLAlchemy() if __name__ == '__main__': APP.config.from_mapping( SQLALCHEMY_DATABASE_URI='postgres://postgres:password@0.0.0.0:5
app.py
:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
APP = Flask(__name__)
DB = SQLAlchemy()
if __name__ == '__main__':
APP.config.from_mapping(
SQLALCHEMY_DATABASE_URI='postgres://postgres:password@0.0.0.0:5432',
SQLALCHEMY_TRACK_MODIFICATIONS=False
)
DB.init_app(APP)
DB.create_all(app=APP)
APP.run(use_reloader=False, host='0.0.0.0', port='5000')
我有一个Dockerfile:
FROM python:3.6-alpine
RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev
WORKDIR /root
COPY app.py .
RUN pip3 install Flask==1.0.2
RUN pip3 install psycopg2-binary==2.7.6.1
RUN pip3 install Flask-SQLAlchemy==2.3.2
CMD ["python3", "app.py"]
我运行:
docker build . --tag flaskapp:1
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=password --name database postgres
docker run --rm -p 5000:5000 flaskapp:1
然后我得到一个例外,指出:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused
Is the server running on host "0.0.0.0" and accepting
TCP/IP connections on port 5432?
如何修复此问题?您已将
0.0.0.0
指定为要连接的IP地址,这没有意义0.0.0.0
是“任意地址”。您可能看到postgres正在0.0.0.0上收听的消息,这就是您从中获得该消息的原因。在侦听0.0.0.0的服务器上下文中,这意味着它正在侦听所有ipv4接口。有关特殊0.0.0.0地址及其含义的更多信息,请参阅
如果要连接到postgres服务,则需要使用其运行位置的有效ip地址或dns名称
在Docker中,如果有多个命名容器连接到同一个用户定义的网络,则可以使用Docker附带的内置服务发现机制
下面是一组经过修改的命令,可以利用这些命令运行:
docker network create mynet
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=password --net mynet --name database postgres
docker run --rm -p 5000:5000 --net mynet flaskapp:1
确保更改代码以连接到
postgres://postgres:password@数据库:5432
而不是postgres://postgres:password@0.0.0.0:5432
您已指定0.0.0
作为要连接的IP地址,这没有意义0.0.0.0
是“任意地址”。您可能看到postgres正在0.0.0.0上收听的消息,这就是您从中获得该消息的原因。在侦听0.0.0.0的服务器上下文中,这意味着它正在侦听所有ipv4接口。有关特殊0.0.0.0地址及其含义的更多信息,请参阅
如果要连接到postgres服务,则需要使用其运行位置的有效ip地址或dns名称
在Docker中,如果有多个命名容器连接到同一个用户定义的网络,则可以使用Docker附带的内置服务发现机制
下面是一组经过修改的命令,可以利用这些命令运行:
docker network create mynet
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=password --net mynet --name database postgres
docker run --rm -p 5000:5000 --net mynet flaskapp:1
确保更改代码以连接到
postgres://postgres:password@数据库:5432
而不是postgres://postgres:password@0.0.0.0:5432
好的,所以我实际上发现--network=host
解决了这个问题。它可能会导致其他问题,但总比不为momentok工作要好,所以我实际上发现--network=host
解决了这个问题。它可能会导致其他问题,但总比暂时不工作好