Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Running Django migrations in a multi-container Docker setup

Is it safe to allow multiple instances of a Django application to run the same database migration at the same time?

Scenario description

This is a setup where a multiple instances of a Django application are running behind a load balancer. When an updated version of the Docker container is available, each of the old Docker images are replaced with the new version.

Distributed Django application diagram

If new Django migrations exist, they need to be run. This leads me to the question: is it safe to allow multiple containers to run the migration (python manage.py migrate) at the same time?


I have two hypothesis about what the answer to this question might be.

  1. Yes it is safe. Due to database level locking, the migration's can't conflict and in the end, one migration script will run while the other reports that there are no migrations to apply.
  2. No this is not safe. The two migrations can possibly conflict with each other as they try to modify the database.
like image 493
Gunther Avatar asked Nov 08 '17 17:11

Gunther


People also ask

What is difference between migrate and Makemigrations in Django?

migrate , which is responsible for applying and unapplying migrations. makemigrations , which is responsible for creating new migrations based on the changes you have made to your models.

How do I run a Django project in a docker container?

Create the Django project by running the docker-compose run command as follows. $ sudo docker-compose run web django-admin startproject composeexample . This instructs Compose to run django-admin startproject composeexample in a container, using the web service’s image and configuration.

Who owns the Django-admin file in a docker container?

If you are running Docker on Linux, the files django-admin created are owned by root. This happens because the container runs as the root user. Change the ownership of the new files. $ sudo chown -R $USER:$USER.

Why can't I run migrations in Django_tables?

When pulling your new images to production your migrations don't jive with what's in the persistent db in the django_tables in prod and you can't run migrations without erroring out. Anyone know how to make all this less painful. We've been using Docker in dev and production for over a year now.

Why are all my services running in Docker containers?

All services will run in Docker containers. Use Docker to get the services up and running quickly without any hassle of configuring and debugging environment-related issues. Besides, make sure that you have Docker and Postgres up and running on your local machine. You could check if those 2 are running by:


1 Answers

No, it's not safe to run the migration in all containers at the same time, since you might end up applying the same migration twice.

There are two possible cases:

  1. Applying the migration twice (e.g. adding a table column) violates a database constraint, so therefore only the first container that run the migration manages to finish the migration. In this case the other containers will die, although your orchestration system probably will restart them.

  2. Applying the migration twice doesn't violate any constraint and therefore can be applied multiple times. In this case you can end up with duplicated data.

In any case, you should try to have only one container applying migrations at the same time.

like image 101
dukebody Avatar answered Nov 15 '22 05:11

dukebody