Docker и Django. django.db.utils.OperationalError: не удалось подключиться к серверу

#django #docker #docker-compose

#django #docker #docker-compose

Вопрос:

Я не могу найти решение, пожалуйста, помогите!

У меня есть Dockerfile

 FROM python:3

ENV PYTHONUNBUFFERED=1

RUN mkdir /app
WORKDIR /app

RUN pip install Django 
    amp;amp; pip install psycopg2 
    amp;amp; pip install jinja2 
    amp;amp; pip install Pillow

COPY . /app/
  

И docker-compose.yaml

 version: "3"

services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=folivora
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - 5432:5432

  site:
    image: folivora:latest
    command: bash -c "python manage.py migrate amp;amp; python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/app
    depends_on:
      - db
    ports:
      - 8000:8000
  

И settings.py

 DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'folivora',
    'USER': 'postgres',
    'PASSWORD': 'postgres',
    'HOST': 'db',
    'PORT': '5432',
}
  

}

И ОШИБКА при запуске «docker-compose up»

 site_1  | django.db.utils.OperationalError: could not connect to server: Connection refused
site_1  |   Is the server running on host "db" (192.168.224.2) and accepting
site_1  |   TCP/IP connections on port 5432?
  

Когда я редактирую docker-compose.yaml, измените строковую команду на:

 command: bash -c "python manage.py runserver 0.0.0.0:8000"
  

все в порядке. Итак, строка миграции нарушила мой код, но я не знаю почему.

Я пытаюсь создать пустой проект django, чтобы проверить ту же конфигурацию. При первом «docker-compose up» все запустилось и работает нормально, но при втором запуске все снова прерывается с той же ошибкой. Со временем эта проблема исчезла из тестового проекта, я не знаю почему, кэш maby или что-то в этом роде…

Новая информация

  1. Запустите docker-compose up с помощью команды command: bash -c "python manage.py runserver 0.0.0.0:8000" в docer-compose.ошибка yaml и перехвата.

  2. Затем Ctrl C (выход из docker, создайте «оболочку»), но не делайте docker-compose down этого, потому что эта команда удаляет созданный контейнер.

  3. Запустите docker-compose up с помощью команды command: bash -c "python manage.py migrate amp;amp; python manage.py runserver 0.0.0.0:8000" в docer-compose.yaml и все успешно запущено.

Я думаю, что это плохое решение.

Комментарии:

1. Я думаю, проблема в том, что ваше приложение Django начинает вызывать команды миграции до того, как ваша база данных станет фактически запущенной. Обратите внимание, что depends_to управляет только порядком создания контейнеров, а не их готовностью. Можете ли вы попробовать wait-for-it db:5432 перед миграцией?

Ответ №1:

Согласно вашей правке, у вас нет никаких проблем с сетью.

Проблема в том, что ваше приложение Django начинает вызывать команды миграции до того, как ваша база данных будет фактически запущена (вы можете проверить это в журналах postgres). Также обратите внимание, что depends_to управляет только порядком создания контейнеров, а не их готовностью.

Вы можете использовать wait-for-it , чтобы дождаться, пока ваш порт postgres станет доступен. Итак, ваш command будет:

 bash -c "wait-for-it db:5432 -- python manage.py migrate amp;amp; python manage.py runserver 0.0.0.0:8000"
  

Если на вашем образе не установлен этот пакет, добавьте apt install wait-for-it его в свой Dockerfile.

Комментарии:

1. Спасибо, это помощь. Но в Dockerfile я добавляю не RUN apt install wait-for-it RUN apt-get -q update amp;amp; apt install wait-for-it

2. Ошибка FileNotFoundError: [Ошибка 2] Нет такого файла или каталога: ‘db: 5432’