Django работает в Docker-контейнере: при запуске и миграции не запускается модель приложения при запуске
У меня 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 и многочисленные изменения в моем коде не дали никаких объяснений этому поведению или исправлению, так что я в замешательстве.
Есть идеи?
PS Вот мой проект и структура приложения:
/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, а мои компакт-диски с скриптами запуска в / django перед запуском команд миграции.
2 ответа
Проверьте ваше приложение Django Dokerfile для 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
реж
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
Тогда вы можете использовать команду миграции как традиционный способ
python manage.py migrate --noinput
Теперь, когда вы запускаете команду, используя docker exec -it
container-id
Затем он запускается внутри рабочего DIR и находит файл manage.py.
У меня была точно такая же проблема. Я думаю, что должно быть migrations/__init__.py
в вашем Django приложении DIR. Убедитесь, что вы скопировали его в свой контейнер. Моим решением было изменить строку в.dockerignore:app/migrations/*
в app/migrations/0*
,