【问题标题】:Is the server running on host "localhost" (::1) and accepting web_1 | TCP/IP connections on port 5432? [duplicate]服务器是否在主机“localhost”(::1) 上运行并接受 web_1 |端口 5432 上的 TCP/IP 连接? [复制]
【发布时间】:2021-11-29 17:12:43
【问题描述】:

您好,我在编写 Django Web 应用程序时出现了类似标题的错误。我收到此错误

Is the server running on host "localhost" (::1) and accepting
web_1  |        TCP/IP connections on port 5432?

我不知道如何解决它,我已经重新启动了 Postgresql 数据库和 docker,但这些都不起作用。

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'fitshop',
        'USER': 'fitshopuser',
        'PASSWORD': 'fitpass',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

docker-compose.yml

version: "3"
   

    services:
      db:
        image: postgres
        volumes:
          - ./data/db:/var/lib/postgresql/data
        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=fitshopuser
          - POSTGRES_PASSWORD=postgres
        ports:
          - "5432:5432"
      web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db

【问题讨论】:

  • 您的数据库服务器未在“localhost”上运行。
  • 请注意,0.0.0.0 是所有 IPv4 地址,而 ::1 是 IPv6 地址。

标签: python django docker docker-compose


【解决方案1】:

在 docker 中运行时,您可以使用服务名称作为主机名。所以,你的 Django 数据库设置应该是这样的:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'fitshopuser',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': '5432',
    }
}

设置中的值应该等于 docker-compose 文件中为db提供的环境变量

        environment:
          - POSTGRES_DB=postgres          # NAME
          - POSTGRES_USER=fitshopuser     # USER
          - POSTGRES_PASSWORD=postgres    # PASSWORD

根据您对 Postgres 的 docker 配置,docker 在端口 5432 上使用用户名 fitshopuser、密码 postgres 和主机名 db 初始化一个名为 postgres 的数据库。
应该在 Django 设置中使用这些值。

关于错误:

服务器是否在主机“localhost”(::1) 上运行并接受 web_1 |端口 5432 上的 TCP/IP 连接?

在名为web 的服务中使用depends_on,它只检查服务db 是否正在运行。这并不意味着 Postgres 数据库已启动并正在运行。

您可以在官方 docker 文档here 中找到相关信息。

        depends_on:
          - db

为了检查 Postgres 是否已准备好并接受端口 5432 上的连接,请使用像 wait-for-it 这样的脚本

我会在名为 web 的服务中简单地安装 postgresql-client 并使用命令 pg_isready 检查 Postgres 是否准备就绪。

将这些行添加到 dockerfile。

RUN apt-get install -y postgresql-client

# provide permissions to run the entrypoint script (update path accordingly)
RUN chmod +x /path/to/entrypoint.sh

更新/添加 entrypoint.sh 文件。

# entrypoint.sh
while ! pg_isready -h db -p 5432 --username=fitshopuser ; do
    echo "Postgres is unavailable - sleeping"
    sleep 2
done

指定名为web的服务的入口点。

      web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        restart: always
        ports:
          - "8000:8000"
        entrypoint: "/path/to/entrypoint.sh"   # Update path
        depends_on:
          - db

【讨论】:

  • 它不起作用,即使我不想使用docker,只要写“python manage.py runserver”我也会得到同样的错误。
  • 您提供的错误表明 Postgres 数据库尚未准备好并且不接受连接。 Potgres docker 需要一些时间来配置其数据库并开始接受端口 5432 上的连接。
  • @Kay 检查 Postgres 是否已启动并正在运行,是否正在接受端口 5432 上的连接。
猜你喜欢
  • 2018-01-20
  • 1970-01-01
  • 2018-12-17
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多