Подтвердить что ты не робот

Как вы выполняете миграцию базы данных 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, и там очень много я не понимаю, как это работает, но этот меня заводит. Почему миграция не просматривается в моих изменениях? Что я делаю неправильно?

4b9b3361

Ответ 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 ...
  1. Получите КОНТЕЙНЕР ID вашего приложения django и войдите в систему:
docker exec -t -i 66175bfd6ae6 bash
  1. Теперь вы вошли в систему, затем перейдите в нужную папку: cd path/to/django_app

  2. И теперь, каждый раз, когда вы редактируете свои модели, запустите в своем контейнере: 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