【问题标题】:Postgres django.db.utils.OperationalError: could not connect to server: Connection refusedPostgres django.db.utils.OperationalError:无法连接到服务器:连接被拒绝
【发布时间】:2019-02-20 16:18:08
【问题描述】:

试图在 docker 中运行我的 django 服务器,但 postgres 端口已被使用?当我运行“docker-compose up”时,我收到此错误:

django.db.utils.OperationalError: could not connect to server: Connection refused
    Is the server running on host "127.0.0.1" and accepting
    TCP/IP connections on port 5432?

ERROR: Service 'web' failed to build: The command '/bin/sh -c python manage.py migrate' returned a non-zero code: 1

sudo 服务 postgresql 状态

返回:

9.6/main (port 5432): online

sudo lsof -nP | grep 听

返回:

postgres  15817         postgres    3u     IPv4            1022328        0t0        TCP 127.0.0.1:5432

我尝试运行“sudo kill -9 15817”,但 docker-compose up 仍然收到相同的错误。

Docker-compose.yml

version: '3'

services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'stemletics',
        'USER': 'stemleticsadmin',
        'PASSWORD': 'changeme',
        'HOST': '127.0.0.1', # set in docker-compose.yml
        'PORT': 5432 # default postgres port
    }
}

【问题讨论】:

  • 请发布您的 docker-compose 文件。您可能需要在 docker-compose 文件中将 network_mode: "host" 添加到 django 服务。
  • 我添加了我的 docker-compose.yml 文件
  • 您的目标是在 Docker 中运行 postgres 吗?还是使用服务对其进行管理?
  • 我的最终目标是让我的网站在 AWS 上的弹性 beanstalk 中运行。我会在外面想吗?然后我可以有多个 docker 来查询一个数据库。

标签: django postgresql docker


【解决方案1】:

为了在 Docker 中使用 postgres,您需要配置数据库用户、密码和数据库名称等信息。这是通过为容器设置环境变量来完成的。可以在here 找到支持的变量的完整列表。

此外,您还需要将 postgres 的端口 5432 公开给您的 web 服务在您的 docker-compose 文件中。

这样的事情应该可以工作:

docker-compose.yml

version: '3'

services:
  db:
    image: postgres
    ports: 
      - "5432"
    environment:
      - POSTGRES_DB=stemletics
      - POSTGRES_USER=stemleticsadmin
      - POSTGRES_PASSWORD=changeme
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

您还必须更改您在settings.py 中使用的主机名。 docker-compose 为您的服务创建一个默认网络并将正在运行的容器附加到该网络。在您的 Web 容器中,数据库将在主机名 db 处可用。

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'stemletics',
        'USER': 'stemleticsadmin',
        'PASSWORD': 'changeme',
        'HOST': 'db', # set in docker-compose.yml
        'PORT': 5432 # default postgres port
    }
}

最后,如果您的 python 代码中没有任何类型的数据库重新连接逻辑,迁移可能仍然会失败。这是因为depends_on 只等待容器启动,但 postgres 在容器运行后需要几秒钟来初始化。

为了快速解决这个问题,一次运行一个容器是最简单的。

即:

$ docker-compose up -d db

等待 postgres 初始化

$ docker-compose up -d web

希望这能让你启动并运行。

【讨论】:

  • django.db.utils.OperationalError:无法将主机名“db”转换为地址:名称或服务未知
  • 出现此错误的python代码是否在docker内部运行,如果是,它是否以docker-compose开头?
  • docker-compose up 是我运行接收它的命令,所以你说 python 代码在 docker 内运行。
【解决方案2】:

我能够解决这个问题,只需构建我的数据库容器,等待几秒钟,然后构建 Web 容器:

docker-compose up -d --build db

等待几秒钟

docker-compose up -d --build web

希望对你有帮助

【讨论】:

    【解决方案3】:

    我在将 PostgreSQL 服务器连接到 windows 操作系统时遇到了同样的问题。然后我应用以下方式。我希望它能帮助解决这个问题...

    1. 下载postgres_sql
    2. 安装 postgresql
    3. 搜索选项打开“SQL Shell (psql)”
    4. 创建数据库

    1. 设置添加数据库....

    settings.py

     DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'stemletics',
            'USER': 'postgres', #default user name
            'PASSWORD': 'changeme',
            'HOST': '127.0.0.1', # default host
            'PORT': '5432', # default postgres port
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-09
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 2013-05-19
      • 2015-01-31
      • 2015-12-25
      相关资源
      最近更新 更多