postgresql - 从容器内的 flask 应用程序连接到 postgres 容器

标签 postgresql docker flask-sqlalchemy

我有我的 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/

相关文章:

postgresql - docker-compose - 无法附加到容器

php - 如何使用docker-compose将用户上传的文件保存到已安装的卷中?

python - Flask-SQLAlchemy数据库引擎返回表名,但元数据中的表键为空

python - Flask 无法运行 db migrate - NameError : name 'conn_uniques' is not defined

python - SQLAlchemy 如何从多对多关系的关联表中获取列值

django.db.utils.ProgrammingError : relation "bot_trade" does not exist

postgresql - 为什么我有一个 PostgreSQL 服务器执行 Hash Join 而另一个服务器执行 Nested Loop Semi Join?

SQL 计数正则表达式匹配 (PostgreSQL)

docker - 通过 Docker API 将私有(private)镜像推送到 Docker Registry

reactjs - Docker共享卷无法通过React刷新