Py学习  »  Django

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

Dominic M. • 4 年前 • 1084 次点击  

试图在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-915817”,但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

设置.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
    }
}
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38083
 
1084 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Jack Gore
Reply   •   1 楼
Jack Gore    5 年前

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

此外,您还需要公开端口 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撰写 为您的服务创建默认网络,并将正在运行的容器附加到此网络。在Web容器中,数据库将在主机名处可用。 db .

设置.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

希望这能让你振作起来。