python - 无法使用 psycopg2 连接到 Postgres 容器

标签 python postgresql docker docker-compose psycopg2

我有以下设置:

  • 容器中的一个简单 Flask 应用

  • 一个 Postgres 容器

使用以下 Dockerfile:

FROM python:alpine3.7

COPY . /app
WORKDIR /app

RUN apk update
RUN apk add --virtual build-deps gcc python3-dev musl-dev
RUN apk add postgresql-dev
RUN pip install -r requirements.txt
RUN apk del build-deps

EXPOSE 5006

CMD ["python", "./app.py"]

对于数据库:

FROM postgres:11.1-alpine

COPY create_db.sql /docker-entrypoint-initdb.d/

EXPOSE 5432

这是我的 docker-compose yaml(映射端口到主机以检查容器工作):

version: '3'
services:
    postgres:
        image: ccdb
        build: ccDb
        restart: always
        environment:
            POSTGRES_PASSWORD: password
        ports:
            - "5432:5432"

    top:
        image: ccpytop
        build: ccPyTop
        ports:
            - "5006:5006"

我可以从主机成功连接到数据库,并且可以导航到 Flask 应用程序提供的应用程序页面。当我导航到某个页面时,应用程序连接到数据库,因此 postgres 容器有足够的时间启动。

当我运行 docker-compose up 时,我得到以下信息:

postgres_1  | 2018-12-04 09:45:13.371 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres_1  | 2018-12-04 09:45:13.371 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres_1  | 2018-12-04 09:45:13.377 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_1  | 2018-12-04 09:45:13.398 UTC [19] LOG:  database system was interrupted; last known up at 2018-12-04 09:42:23 UTC
postgres_1  | 2018-12-04 09:45:13.521 UTC [19] LOG:  database system was not properly shut down; automatic recovery in progress
postgres_1  | 2018-12-04 09:45:13.524 UTC [19] LOG:  redo starts at 0/1680BC8
postgres_1  | 2018-12-04 09:45:13.524 UTC [19] LOG:  invalid record length at 0/1680CA8: wanted 24, got 0
postgres_1  | 2018-12-04 09:45:13.524 UTC [19] LOG:  redo done at 0/1680C70
postgres_1  | 2018-12-04 09:45:13.536 UTC [1] LOG:  database system is ready to accept connections

但是当我在 python 容器中执行以下操作时

>>> import psycopg2
>>> conn = psycopg2.connect("host=/var/run/postgresql dbname=postgres user=postgres password=password")

我明白了:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/site-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

我尝试在没有主机的情况下运行,但我得到了相同的消息,使用 /tmp/ 而不是 /var/run/。我也尝试过链接容器,但我注意到这是一项遗留功能,无论如何都不起作用。

这是我第一次使用 docker-compose,我几乎卡在了这一点上。有什么想法吗?

最佳答案

您正在运行 2 个独立的容器,它们彼此不知道,因此无法相互通信。

为了从一个容器到另一个容器进行通信,它们必须在同一个网络上。在 Docker 中,您可以创建自己的子网:

docker network create <network-name>

然后您可以通过添加将容器添加到网络

--network=<network-name> --network-alias=<network-alias>

docker run容器的命令。

Docker 容器随后可以通过其 <network-alias> 被同一网络上的任何其他容器访问。 .对你来说,这意味着

conn = psycopg2.connect("host=/var/run/postgresql dbname=postgres user=postgres password=password")

更改为

conn = psycopg2.connect("host=<network-alias> dbname=postgres user=postgres password=password")

哪里network-alias是您为 postgres 容器提供的别名。

编辑

查看docker-compose networking有关如何在 docker-compose 中执行此操作的手册。 显然 docker-compose 在启动时设置了自己的网络。如果您的 docker-compose 位于 directory ,然后 docker-compose 将创建一个网络 directory_default通过您在 docker-compose 文件中给它们的名称可以发现不同的容器。因此,如果您将 python 命令更改为

conn = psycopg2.connect("host=postgres dbname=postgres user=postgres password=password")

它应该可以工作。

关于python - 无法使用 psycopg2 连接到 Postgres 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53610266/

相关文章:

python - 如何让图像出现在python/pygame中

sql - 列出列的所有不同值及其计数

python - Keras 合并 VS 连接,无法更新我的代码

python - 具有相同颜色的散点图和等高线图

python 如何在我的方法调用中删除 None?

reactjs - 部署到 DigitalOcean 时 GitHub 操作失败

docker - Azure DevOps Pipeline在docker推送任务中引用当前标签

ruby-on-rails - 运行 heroku rake db :migrate 时出现 Heroku 错误

linux - 更改配置后 statsinfo 扩展未激活

c# - 带有 docker microsoft/iis 的卷