我有我的烧瓶应用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 :(得分:3)
您已指定0.0.0.0
作为要连接的IP地址,这没有任何意义。 0.0.0.0
是“任何地址”。您可能会看到一条消息,表明postgres正在监听0.0.0.0,这是从中获取消息的地方。在服务器侦听0.0.0.0的上下文中,这意味着它正在侦听所有ipv4接口。有关特殊0.0.0.0地址及其含义的更多信息,请参见https://en.wikipedia.org/wiki/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@database:5432
而不是postgres://postgres:password@0.0.0.0:5432