Postgres django.db.utils.OperationalError: не удалось подключиться к серверу: соединение отклонено - PullRequest
0 голосов
/ 16 сентября 2018

Пытаетесь запустить мой сервер 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
    }
}

1 Ответ

0 голосов
/ 16 сентября 2018

Чтобы использовать postgres внутри Docker, вам нужно настроить информацию, такую ​​как пользователь базы данных, пароль и имя базы данных.Это делается путем установки переменных среды для контейнера.Полный список поддерживаемых переменных можно найти здесь .

Кроме того, вы захотите открыть порт 5432 postgres для вашей службы 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 создает сеть по умолчанию для ваших служб и присоединяет к ней запущенные контейнеры.Внутри вашего веб-контейнера база данных будет доступна по имени хоста 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

Надеемсяэто заставляет вас работать.

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