Postgres django.db.utils.OperationalError:无法连接到服务器:连接被拒绝

时间:2018-09-16 15:59:17

标签: django postgresql docker

尝试在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 LISTEN

返回:

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
    }
}

3 个答案:

答案 0 :(得分:1)

仅通过构建数据库容器,等待几秒钟,然后构建Web容器,我就能解决此问题:

docker-compose up -d --build db

等待几秒钟

docker-compose up -d --build web

我希望这会有所帮助

答案 1 :(得分:0)

为了在Docker内部使用postgres,您将需要配置数据库用户,密码和db-name之类的信息。这是通过为容器设置环境变量来完成的。 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

希望这能使您启动并运行。

答案 2 :(得分:0)

将PostgreSQL服务器连接到Windows操作系统时,我遇到了同样的问题。然后我采用以下方式。我希望它将有助于解决这个问题...

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

enter image description here

  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
    }
}