Как вы выполняете миграцию базы данных Django при использовании Docker-Compose?
Я установил приложение Docker Django/PostgreSQL, внимательно следуя инструкциям Django Quick Start на сайте Docker.
При первом запуске Django manage.py migrate, используя команду sudo docker-compose run web python manage.py migrate
, она работает так, как ожидалось. База данных встроена в контейнер Docker PostgreSQL просто отлично.
Изменения, внесенные в приложение Django, также отражаются в контейнере Docker Django, как только я их сохраню. Это здорово!
Но если я затем изменю модель в Django и попытаюсь обновить базу данных Postgres в соответствии с моделью, изменений не будет обнаружено, поэтому миграция не произойдет независимо от того, сколько раз я снова запускаю makemigrations
или migrate
.
В принципе, каждый раз, когда я меняю модель Django, я должен удалить контейнеры Docker (используя sudo docker-compose rm
) и начать заново с новой миграции.
Я все еще пытаюсь склонить голову к Docker, и там очень много я не понимаю, как это работает, но этот меня заводит. Почему миграция не просматривается в моих изменениях? Что я делаю неправильно?
Ответы
Ответ 1
Вам просто нужно войти в свой контейнер докеров и запустить свои команды.
- Создайте свой стек:
docker-compose build -f path/to/docker-compose.yml
- Запустите свой стек:
docker-compose up -f path/to/docker-compose.yml
- Отобразить контейнеры для запуска докеров:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3fcc49196a84 ex_nginx "nginx -g 'daemon off" 3 days ago Up 32 seconds 0.0.0.0:80->80/tcp, 443/tcp ex_nginx_1
66175bfd6ae6 ex_webapp "/docker-entrypoint.s" 3 days ago Up 32 seconds 0.0.0.0:32768->8000/tcp ex_webapp_1
# postgres docker container ...
- Получите КОНТЕЙНЕР ID вашего приложения django и войдите в систему:
docker exec -t -i 66175bfd6ae6 bash
-
Теперь вы вошли в систему, затем перейдите в нужную папку: cd path/to/django_app
-
И теперь, каждый раз, когда вы редактируете свои модели, запустите в своем контейнере: python manage.py makemigrations
и python manage.py migrate
Я также рекомендую вам использовать точку входа в докер для файла контейнера django docker для запуска автоматически:
- collecstatic
- мигрирует
- runningerver или запустите его с помощью пушки или uWSGI
Вот пример (docker-entrypoint.sh
):
#!/bin/bash
# Collect static files
echo "Collect static files"
python manage.py collectstatic --noinput
# Apply database migrations
echo "Apply database migrations"
python manage.py migrate
# Start server
echo "Starting server"
python manage.py runserver 0.0.0.0:8000
Ответ 2
Я использую эти методы:
services:
web:
build: .
image: uzman
command: python manage.py runserver 0.0.0.0:8000
ports:
- "3000:3000"
- "8000:8000"
volumes:
- .:/code
depends_on:
- migration
- db
migration:
image: uzman
command: python manage.py migrate --noinput
volumes:
- .:/code
depends_on:
- db
Используя docker
иерархию docker
, миграция сервиса выполняется после настройки базы данных и до запуска основного сервиса. Теперь, когда вы запустите ваш сервис, docker
запустит миграцию до того, как запустит сервер; Посмотрите, что сервер migration
применяется поверх того же изображения, что и веб-сервер, это означает, что все миграции будут взяты из вашего проекта, избегая проблем.
Таким образом вы избегаете создания точки входа или чего-либо еще.
Ответ 3
Запустите ваш стек, а затем запустите команду запуска одним выстрелом. например
#assume django in container named web
docker-compose run web python3 manage.py migrate
https://docs.docker.com/compose/reference/run/
Ответ 4
Вы можете использовать команду docker exec
docker exec -it container_id python manage.py migrate
Ответ 5
Я знаю, что это старо, и, возможно, я что-то здесь упускаю (если так, пожалуйста, просветите меня!), Но почему бы просто не добавить команды в ваш скрипт start.sh
, запускаемый Docker для запуска вашего экземпляра? Это займет всего несколько дополнительных секунд.
NB. Я установил переменную DJANGO_SETTINGS_MODULE
чтобы убедиться, что используется правильная база данных, так как я использую разные базы данных для разработки и производства (хотя я знаю, что это не "лучшая практика").
Это решило это для меня:
#!/bin/bash
# Migrate the database first
echo "Migrating the database before starting the server"
export DJANGO_SETTINGS_MODULE="edatool.settings.production"
python manage.py makemigrations
python manage.py migrate
# Start Gunicorn processes
echo "Starting Gunicorn."
exec gunicorn edatool.wsgi:application \
--bind 0.0.0.0:8000 \
--workers 3
Ответ 6
При использовании docker exec я получил следующую ошибку:
AppRegistryNotReady("Models aren't loaded yet.")
Поэтому я использовал эту команду вместо:
docker-compose -f local.yml run django python manage.py makemigrations