【问题标题】:Python application cannot connect to PostgreSQL DockerPython 应用程序无法连接到 PostgreSQL Docker
【发布时间】:2019-01-04 14:16:28
【问题描述】:

谁能帮我解决这个问题?

Dockerfile 用于我的图像:

FROM python:3.6.1
ENV PYTHONUNBUFFERED 1
RUN mkdir /hlcup
WORKDIR /hlcup
ADD requirements.txt /hlcup/
RUN pip install --upgrade pip
RUN pip3 install -r requirements.txt
ADD . /hlcup/
EXPOSE 80
EXPOSE 5432

我的 docker-compose.yml

version: '3'

services:
db:
    image: postgres
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    ports:
      - "5432:5432"
  web:
    build: .
    command: python3 main.py
    volumes:
      - .:/hlcup
      - ./data:/tmp/data/
    ports:
      - "80:80"
    depends_on:
      - db    

我运行我的构建:docker-compose up --build

因此,应用程序应该连接到数据库,但我收到连接错误:

web_1  |     conn = await asyncpg.connect(**DB_PARAMS)
web_1  |   File "/usr/local/lib/python3.6/site-packages/asyncpg/connection.py", line 1688, in connect
web_1  |     max_cacheable_statement_size=max_cacheable_statement_size)
web_1  |   File "/usr/local/lib/python3.6/site-packages/asyncpg/connect_utils.py", line 551, in _connect
web_1  |     raise last_error
web_1  |   File "/usr/local/lib/python3.6/site-packages/asyncpg/connect_utils.py", line 543, in _connect
web_1  |     connection_class=connection_class)
web_1  |   File "/usr/local/lib/python3.6/site-packages/asyncpg/connect_utils.py", line 513, in _connect_addr
web_1  |     connector, timeout=timeout, loop=loop)
web_1  |   File "/usr/local/lib/python3.6/asyncio/tasks.py", line 352, in wait_for
web_1  |     return fut.result()
web_1  |   File "/usr/local/lib/python3.6/asyncio/base_events.py", line 776, in create_connection
web_1  |     raise exceptions[0]
web_1  |   File "/usr/local/lib/python3.6/asyncio/base_events.py", line 763, in create_connection
web_1  |     yield from self.sock_connect(sock, address)
web_1  |   File "/usr/local/lib/python3.6/asyncio/selector_events.py", line 451, in sock_connect
web_1  |     return (yield from fut)
web_1  |   File "/usr/local/lib/python3.6/asyncio/selector_events.py", line 481, in _sock_connect_cb
web_1  |     raise OSError(err, 'Connect call failed %s' % (address,))
web_1  | ConnectionRefusedError: [Errno 111] Connect call failed ('0.0.0.0', 5432)

【问题讨论】:

  • 简短回答:配置您的应用程序(最好使用环境变量)以连接到其他 Docker Compose 服务名称 db 作为主机名。 localhost 表示“这个容器”,在 Linux 上到 0.0.0.0(不是“真实”IP 地址)的出站连接也转到 localhost

标签: docker docker-compose dockerfile


【解决方案1】:

您的容器 web 正在尝试使用本地 ip 0.0.0.0:5432 连接到数据库,而数据库位于具有另一个 ip 的其他容器上。

docker-compose 支持容器之间的 DNS,所以我会尝试在 python 应用程序中从 ip 号更改为 DNS。

在您的 docker-compose 文件中,postgres 数据库 DNS 为 db

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2021-11-09
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多