How do you perform Django database migrations when using Docker-Compose? How do you perform Django database migrations when using Docker-Compose? django django

How do you perform Django database migrations when using Docker-Compose?


You just have to log into your running docker container and run your commands.

  1. Build your stack : docker-compose build -f path/to/docker-compose.yml
  2. Launch your stack : docker-compose up -f path/to/docker-compose.yml
  3. Display docker running containers : docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES3fcc49196a84        ex_nginx          "nginx -g 'daemon off"   3 days ago          Up 32 seconds       0.0.0.0:80->80/tcp, 443/tcp   ex_nginx_166175bfd6ae6        ex_webapp         "/docker-entrypoint.s"   3 days ago          Up 32 seconds       0.0.0.0:32768->8000/tcp       ex_webapp_1# postgres docker container ...
  1. Get the CONTAINER ID of you django app and log into :
docker exec -t -i 66175bfd6ae6 bash
  1. Now you are logged into, then go to the right folder : cd path/to/django_app

  2. And now, each time you edit your models, run in your container : python manage.py makemigrations and python manage.py migrate

I also recommend you to use a docker-entrypoint for your django docker container file to run automatically :

  • collecstatic
  • migrate
  • runserver or start it with gunicorn or uWSGI

Here is an example (docker-entrypoint.sh) :

#!/bin/bash# Collect static filesecho "Collect static files"python manage.py collectstatic --noinput# Apply database migrationsecho "Apply database migrations"python manage.py migrate# Start serverecho "Starting server"python manage.py runserver 0.0.0.0:8000


I use these method:

services:  web:    build: .    image: uzman    command: python manage.py runserver 0.0.0.0:8000    ports:      - "3000:3000"      - "8000:8000"    volumes:      - .:/code    depends_on:      - migration      - db  migration:    image: uzman    command: python manage.py migrate --noinput    volumes:      - .:/code    depends_on:      - db

Using docker hierarchy we made, the service migration runs after set up the database and before to run the main service. Now when you run your service docker will run migrations before runs the server; look that migration server is applied over the same image that web server, it means that all migrations will be taken from your project, avoiding problems.

You avoid made entry point or whatever other thing with this way.


Have your stack running then fire off a one shot docker-compose run command. E.g

#assume django in container named webdocker-compose run web python3 manage.py migrate

This works great for the built-in (default) SQLite database, but also for an external dockerized database that's listed as dependency. Here's an example docker-compose.yaml file

version: '3'services:  db:    image: postgres  web:    build: .    command: python manage.py runserver 0.0.0.0:8000    volumes:      - .:/code    ports:      - "8000:8000"    depends_on:      - db

https://docs.docker.com/compose/reference/run/