我有我的 flask 应用 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 接口(interface)。参见 https://en.wikipedia.org/wiki/0.0.0.0有关特殊 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
关于postgresql - 从容器内的 flask 应用程序连接到 postgres 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53565005/