Django работает в Docker-контейнере: make-миграции и миграция не видят модель приложения при запуске - PullRequest
0 голосов
/ 04 мая 2018

У меня Django работает в контейнере Docker. CMD моего Docker-файла просто запускает скрипт launch.sh, в котором среди прочего есть следующие команды:

python manage.py makemigrations --no-input --verbosity 1
python manage.py migrate --no-input --verbosity 1

Итак, эти команды выполняют миграцию в моем проекте Django, а затем выполняют миграции (если таковые имеются) всякий раз, когда запускается мой контейнер. Это работает как предназначено для специфических миграций на уровне проекта .

Однако, неизбежно, только только выполняется миграция на уровне проекта, то есть миграция на уровне приложения никогда не выполняется и поэтому никогда не выполняется. Но Если я войду в контейнер (с помощью docker exec -it ... bash) и выполню те же самые команды миграции вручную, миграции на уровне приложения будут выполнены и выполнены.

Поиск в Google и многочисленные изменения в моем коде не дали никаких объяснений этому поведению или исправлению, так что я в замешательстве.

Есть идеи?

P.S. Вот мой проект и структура приложения:

/django/
    project/
    app/
    static/
    manage.py

Кроме того, я попытался выполнить один и тот же набор команд два раза подряд в моем сценарии, а также запустить один и тот же набор команд подряд, но с моим приложением, указанным в качестве параметра назначения, но эти попытки все же дали те же результаты: только выполняются миграции проекта, а не миграции приложений.

Как и просили, вот мой Dockerfile:

FROM python:3-slim
ENV PYTHONUNBUFFERED 1 
ADD django-requirements.pip . 
RUN pip install --upgrade pip && \ 
    pip install --no-cache-dir -r django-requirements.pip 
WORKDIR / 
ADD launch.sh . 
CMD ./launch.sh 

Мой проект Django монтируется при запуске в / django, а мои CD-скрипты запускаются в / django перед запуском команд миграции.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

У меня была точно такая же проблема. Я думаю, что в вашем каталоге Django должно быть migrations/__init__.py. Убедитесь, что вы скопировали его в свой контейнер. Моим решением было изменить строку в .dockerignore: app/migrations/* до app/migrations/0*.

0 голосов
/ 04 мая 2018

Проверьте приложение Dokerfile для Django на WORKDIR

# In my case it is /app
WORKDIR /app

и измените launch.sh файл

# manage.py will be inside working dir 
python /app/manage.py migrate --noinput

ОБНОВЛЕНИЕ

Это зависит от того, куда вы скопировали launch.sh файл внутри контейнер.

Если вы скопировали все файлы приложения Django внутри /app dir

COPY . /app

и скопируйте файл launch.sh вне его, например

COPY ./<path to launch file>/launch.sh /launch.sh

затем внутри launch.sh вы должны использовать manage.py как

# should prepend `/app/` 
python /app/manage.py migrate --noinput 

Но если вы скопировали файл launch.sh внутри /app/ как.

COPY ./<path to launch file>/launch.sh /app/launch.sh

Тогда вы можете использовать команду migrate как традиционный способ

python manage.py migrate --noinput 

Теперь, когда вы запускаете команду, используя docker exec -it container-id, тогда она запускается внутри рабочего DIR и находит manage.py файл.

...