【问题标题】:Docker-compose on a django app postgresql connection refusedjango 应用程序 postgresql 连接上的 Docker-compose 被拒绝
【发布时间】:2020-02-13 04:54:58
【问题描述】:

我尝试 dockerize 我的 django 应用程序, 这是我的 docker-compose.yml:

version: '3'

networks:
  mynetwork:
    driver: bridge

services:

  postgres:
    restart: always
    image: postgres:11
    ports:
      - "5432:5432"
    volumes:
      - ./data:/var/lib/postgresql/data

  web:
    build: .
    command: python /Code/core/manage.py runserver 0.0.0.0:8000
    networks:
      - mynetwork

    ports:
      - "8000:8000"

    depends_on:
      - postgres

在我的 django 应用程序中,在我的 settings.py 中,我有以下用于 db 连接的参数: 设置.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydbname',
        'USER': 'mydbuser',
        'PASSWORD': 'mydbpassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
        'OPTIONS': {
            'client_encoding': 'UTF8',
        },
    }
}

在我跑步的这一刻

docker-compose build

al 已经完成了,但是当我这样做时:

docker-compose up

我得到这个错误:

conn = _connect(dsn, connection_factory=connection_factory, **kwasync) web_1 | psycopg2.OperationalError:无法连接到服务器:连接被拒绝 web_1 |服务器是否在主机“127.0.0.1”上运行并接受 web_1 |端口 5432 上的 TCP/IP 连接?

如何使用我的 docker postgres 映像管理我的 django db 连接参数?

提前非常感谢

【问题讨论】:

标签: django postgresql docker docker-compose


【解决方案1】:

您应该将数据库设置的host 更改为postgres,因为这是docker-compose 中的服务名称。在内部 docker-compose 将创建一个网络并将容器附加到它。 docker-compose 中定义的服务名称将是映射到容器 IP 的 DNS 名称:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydbname',
        'USER': 'mydbuser',
        'PASSWORD': 'mydbpassword',
        'HOST': 'postgres',
        'PORT': '5432',
        'OPTIONS': {
            'client_encoding': 'UTF8',
        },
    }
}

另外请记住,depends_on 不会确保在应用容器尝试访问数据库之前完全初始化数据库。这也记录在我分享的链接中:

depends_on 在启动 web 之前不会等待 db 和 redis “准备好” - 直到它们已经启动。如果您需要等待服务就绪,请参阅Controlling startup order 了解有关此问题的更多信息和解决策略。

【讨论】:

  • django.db.utils.OperationalError: could not translate host name "postgres" to address: Name doesn't resolve
【解决方案2】:

在 docker-compose 中,您可以利用 docker-compose 网络。您可以根据容器名称进行服务到服务的通信。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydbname',
        'USER': 'mydbuser',
        'PASSWORD': 'mydbpassword',
        'HOST': 'postgres',
        'PORT': '5432',
        'OPTIONS': {
            'client_encoding': 'UTF8',
        },
    }
}

在您使用127.0.0.1 的连接中,它指的是web-app 的本地主机,而不是@Michalk 在评论中提到的postgress。

【讨论】:

  • 谢谢,如果我尝试使用 postgres,我会得到:django.db.utils.OperationalError: could not translate host name "postgres" to address: Name doesn't resolve
  • @ManuelSanti 运行docker ps 并确认postgres 服务是否正常运行。
猜你喜欢
  • 2021-09-20
  • 1970-01-01
  • 2021-10-12
  • 2016-03-08
  • 2017-08-05
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
相关资源
最近更新 更多