Миграции Django и докер-контейнеры - PullRequest
0 голосов
/ 10 мая 2018

Как обрабатывать миграции Django при использовании Docker.

Например, используя контейнеры в вашей среде разработки, у вас есть приложение Django и другие сервисы, такие как контейнер Postgresql db. Все докер вытащено и составлено докером. Вуаля!

Теперь вам предлагается добавить функции, которые требуют изменения базы данных. Нет проблем в разработке Вы вносите некоторые изменения в модель, используете makemigrations и migrate, и все выглядит хорошо.

При выводе новых изображений в производство ваши миграции не совпадают с постоянными db в django_tables в prod, и вы не можете запускать миграции без ошибок.

Кто-нибудь знает, как сделать все это менее болезненным.

Ответы [ 2 ]

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

Мы используем Docker в разработке и производстве уже более года.Если я правильно понимаю вашу ситуацию, проблема в том, что ваша производственная схема БД со временем не синхронизируется с вашей схемой разработки.

Что помогло нам, так это наличие легко отправляемых снимков нашей производственной схемы (с некоторыми тестовыми данными), чтобы при создании образа dev вы работали с производственной схемой и создавали миграции на основе схемы prod.Когда вы убедитесь, что ваша схема для переноса является надежной, проверьте эти миграции в системе управления версиями.

Развертывание на prod затем отправляет образ с такими миграциями, которые гарантированно будут корректно применяться к схеме prod.

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

Запуск миграции на док-контейнере.Предположим, ваш файл компоновки выглядит так:

services:
  # cointainer for django app
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    depends_on:
      - db

Используйте команду docker-compose run

Запустить команду вручную, имя контейнера приложения Django: app

docker-compose run app python manage.py migrate

# use if docker compose file name is other than `docker-compose.yml` 
docker-compose -f production.yml run app python manage.py migrate

Использовать entrypoint.sh

Запускать автоматически каждый раз, когда вы up контейнер.

Создайте имя файла entrypoint.sh в корневом каталоге проекта и скопируйте приведенную ниже командув нем.

python manage.py migrate --noinput

В DockerFile скопируйте entrypoint.sh из папки вашего проекта в контейнер app.

COPY ./entrypoint.sh /entrypoint.sh
RUN sed -i 's/\r//' /entrypoint.sh
RUN chmod +x /entrypoint.sh
RUN chown app /entrypoint.sh

Теперь есть 2способы, которыми вы можете entrypoint.sh запускать автоматически

Упоминание ENTRYPOINT в самом DockerFile.

ENTRYPOINT ["/entrypoint.sh"]

Или вы можете упомянуть об этом в docker-composeфайл с ключевым словом command под app.

app:
   build:
     context: .
     dockerfile: ./Dockerfile
   depends_on:
     - db
   # this will run after cointainer `up`
   command: /entrypoint.sh
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...