Docker-compose в приложении django postgresql отказывается от соединения - PullRequest
0 голосов
/ 16 октября 2019

я пытаюсь докернизировать мое приложение 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 у меня есть эти параметры для соединения с БД: 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

все было сделано, но когда я выполняю:

docker-compose up

я получаю эту ошибку:

conn = _connect (dsn, connection_factory = connection_factory, ** kwasync) web_1 |psycopg2.OperationalError: не удалось подключиться к серверу: соединение отклонено web_1 |Сервер работает на хосте "127.0.0.1" и принимает web_1 |Соединения TCP / IP через порт 5432?

как я могу управлять параметрами соединения django db, используя образ docker postgres?

Заранее большое спасибо

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Вам следует изменить host настроек вашей базы данных на postgres, так как это имя службы в вашем docker-compose. Внутренне docker-compose создаст сеть и присоединит к ней контейнеры. Имена служб, определенные в docker-compose, будут DNS-именами, сопоставленными с IP-адресами контейнеров:

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 не ждет, пока БД и redis будут «готовы» перед запуском веб - только до их запуска. Если вам нужно дождаться готовности службы, см. Управление порядком запуска , чтобы узнать больше об этой проблеме и стратегиях ее решения.

0 голосов
/ 16 октября 2019

В 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, оно ссылается на localhost веб-приложения, а не на postgress, который также упоминается в комментарии @Michalk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...