@EdvardYoch

Почему команда python manage.py migrate после отработки не завершается и не возвращает управление в консоль?

Пытаюсь решить следующую задачу. Есть приложение на Django и мне необходимо реализовать запуск данного приложения через Docker. В качестве БД подключаем контейнер с PostgreSQL или MySQL. При запуске через docker-compose необходимо сделать чтоб перед запуском приложения Django, Django создал необходимые таблицы в БД. Для этого в файле docker-compose.yml в атрибуте comand перед командой запуска сервера прописываем команду python manage.py migrate. Данная команда создаёт все необходимы таблицы, но после выполнения процесс не завершается и, собственно, не даёт запуститься следующей команде.

some lines....
web_1  |   Applying datapage.0001_initial... OK
web_1  |   Applying datapage.0002_auto_20190709_1955... OK
web_1  |   Applying datapage.0003_auto_20190713_1358... OK
web_1  |   Applying datapage.0004_auto_20190720_1107... OK
web_1  |   Applying sessions.0001_initial... OK


При этом если использовать следующий подход:

docker-compose exec web python manage.py migrate

Получаем тоже самое:

some lines....
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying datapage.0001_initial... OK
  Applying datapage.0002_auto_20190709_1955... OK
  Applying datapage.0003_auto_20190713_1358... OK
  Applying datapage.0004_auto_20190720_1107... OK
  Applying sessions.0001_initial... OK


Нажав Cntrl+C, получаем следующую ошибку:

^CException ignored in: <module 'threading' from '/usr/local/lib/python3.7/threading.py'>
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/threading.py", line 1307, in _shutdown
    lock.acquire()
KeyboardInterrupt


Конфигурация файла docker-compose.yml следующая:

version: '3'

services:
  web:
    build: .
    command: >
      bash -c "
            sleep 40 &&
            python manage.py migrate --noinput &&
            python manage.py runserver 0.0.0.0:8000 --noreload"
    
    ports:
      - '8000:8000'
    depends_on:
      - db
  db:
    image: mysql:5.7
    ports:
      - '3306:3306'
    environment:
      MYSQL_DATABASE: 'db_django'
      MYSQL_ROOT_PASSWORD: 'password'
    restart: always


Применять python manage.py makemigrations в данном случае не нужно так это первая инициация таблиц в БД, но если применить получаем такую же проблему, как и с python manage.py migrate, то есть после выполнение не отдает управление в консоль:

No changes detected
(Жмём Cntrl+C)
^CException ignored in: <module 'threading' from '/usr/local/lib/python3.7/threading.py'>
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/threading.py", line 1307, in _shutdown
    lock.acquire()
KeyboardInterrupt


Такое поведение получаем при работе с PostgreSQL и MySQL как через docker так и на установленных локально, но при работе с SQLite данная команда ведёт себя корректно, то есть после завершения возвращает в консоль. Так же оставил выполнятся данную команду на ночь чтобы убедиться, что она именно зависает, а не выполняется длительное время, по итогу посмотрев утром, данная команда все ещё работала.

При изменении версий в диапазоне python 3.6-3.9 и Django 2.1-2.2 ситуация не изменилась.

3 часа “гугления” на русском и на английском результатов не дали, смущает только то, что другие люди использовали тот же самый подход с командой python manage.py migrate в файле docker-compose.yml, и создаётся ощущение что у них такой проблемы не возникло. Но попробовав запустить у друга на его машине, получили ту же ошибку.

Собственно, хочется узнать почему python manage.py migrate даёт такое поведение, может это баг Django ORM или ещё что. А так же, как можно это исправить, или какую альтернативу можно использовать, чтобы миграции выполнялись через docker-compose.yml, а не прописывать отдельно после запуска контейнеров через docker-compose exec.

Так же прилагаю исходный код данного приложения на GIthub
  • Вопрос задан
  • 1244 просмотра
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы