Миграции Django с помощью Docker compose и томов
Я использую Django с Docker compose, и все постоянные файлы сохраняются в томе. Моя проблема заключается в том, что я также сохраняю свою базу данных в этом томе: как это влияет на миграции? Я добавил новую схему, и, похоже, нет способа отразить это изменение в БД. Когда я применяю миграции в локальной среде, все работает, миграции правильно применяются, и я вижу новую схему БД, но это потому, что я создал локальную папку app/static, которая отражает имя тома в docker-compose. Теперь, поскольку БД находится в этой папке, все работает, поскольку миграции применяются к БД. Когда я развертываю свое приложение, база данных внутри app/static остается старой базой данных, с теми же старыми записями и теми же старыми схемами. Как я могу применить миграции, чтобы база данных внутри тома app/static отражала новые изменения без потери старых записей? В качестве практического примера я добавил новую модель Action, которая не существует на сервере. Поэтому в БД есть все схемы, кроме Action. Локально я запускаю makemigrations и migrate, создаю файлы миграции (которые идут в Djangoapp/migrations) и обновляю БД (которая находится в app/static). Однако, после того, как я нажимаю на кнопку, я, очевидно, не вижу новой схемы в базе данных. Как это можно обойти? Я уже пробовал добавить в Dockerfile строки
RUN python3 manage.py makemigrations
RUN python3 manage.py migrate
без успеха, так как при миграции я получаю ошибку, что доступ к базе данных невозможен (что логично, так как том не существует, когда я собираю Dockerfile). Я также пробовал добавить точку входа, но это приводит к той же проблеме, что и выше. Даже удаление базы данных и миграций, а затем их повторное применение на стороне сервера не помогло. Я схожу с ума от этого и не могу найти решение нигде в Интернете. Ни одно из тех, что я пробовал, не сработало. Вот мой docker-compose.yml:
version: '2' сервисы: web0: build: . команда: python manage.py runserver 0.0.0.0:8000 порты: - "8000:8000" тома: - saved_data:/app/static
Профиль Dockerfile:
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get install -y --no-install-recommends build-essential r-base r-cran-randomforest python3.6 python3-pip python3-setuptools python3-dev wget libaio1
RUN apt-get install -y --no-install-recommends xmlsec1
WORKDIR .
COPY requirements.txt requirements_remote.txt
RUN pip3 install -r requirements_remote.txt
RUN Rscript -e "install.packages('data.table')"
RUN pip3 install matplotlib
RUN Rscript -e "install.packages('stargazer')"
RUN wget https://download.oracle.com/otn_software/linux/instantclient/217000/instantclient-basic-linux.x64-21.7.0.0.0dbru.zip
RUN mkdir "/opt/oracle"
RUN unzip instantclient-basic-linux.x64-21.7.0.0.0dbru.zip -d /opt/oracle
RUN sh -c "echo /opt/oracle/instantclient_21_4 > /etc/ld.so.conf.d/oracle-instantclient.conf"
RUN ldconfig
COPY . .
RUN chmod +x ./docker-entrypoint.sh
RUN chmod +rwx Djangoapp/migrations
EXPOSE 8000
ARG USER=myself
ARG UID=1001
ARG GID=1001
RUN groupadd -g $GID -o $USER
RUN useradd -m -u $UID -g $GID -o -s /bin/bash $USER
USER ${UID}:${GID}
CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]
А вот точка входа, которую я пытался использовать:
#!/bin/bash
# Collect static files
#echo "Collect static files"
#python3 manage.py collectstatic --noinput
set -e
echo "Preparing database migrations"
python3 manage.py makemigrations
echo "Applying database migrations 2"
python3 manage.py migrate --no-input
echo "Starting server."
python3 manage.py runserver 0.0.0.0:8000