Docker-在Django应用程序Postgresql连接拒绝上撰写

时间:2019-10-16 12:00:33

标签: django postgresql docker docker-compose

我尝试将我的django应用程序进行docker化, 这是我的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中,我具有用于数据库连接的以下参数: settings.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数据库连接参数?

非常感谢

2 个答案:

答案 0 :(得分:0)

在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。

答案 1 :(得分:0)

您应该将数据库设置的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,以获取有关此问题的更多信息以及解决方案。