#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 или что-то в этом роде…
Новая информация
-
Запустите
docker-compose up
с помощью командыcommand: bash -c "python manage.py runserver 0.0.0.0:8000"
в docer-compose.ошибка yaml и перехвата. -
Затем Ctrl C (выход из docker, создайте «оболочку»), но не делайте
docker-compose down
этого, потому что эта команда удаляет созданный контейнер. -
Запустите
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’