2015-11-30 9 views
34

Ho installato un'applicazione Docker Django/PostgreSQL seguendo attentamente lo Django Quick Start instructions on the Docker site.Come si eseguono le migrazioni del database Django quando si utilizza Docker-Compose?

La prima volta che eseguo la migrazione di manage.py di Django, utilizzando il comando sudo docker-compose run web python manage.py migrate, funziona come previsto. Il database è integrato nel contenitore Docker PostgreSQL.

Le modifiche apportate all'applicazione Django si riflettono anche nel contenitore Docker Django, nel momento in cui le salvo. È ottimo!

Ma se poi cambiare un modello di Django, e cerco di aggiornare le Postgres del database in modo che corrisponda al modello, non si rilevano variazioni in modo da nessuna migrazione accade non importa quante volte ho eseguito makemigrations o migrate di nuovo.

Fondamentalmente, ogni volta che cambio il modello Django, devo cancellare i contenitori Docker (usando sudo docker-compose rm) e ricominciare da capo con una nuova migrazione.

Sto ancora cercando di capire la Docker, e c'è un sacco di cose che non capisco come funziona, ma questo mi sta facendo impazzire. Perché la migrazione non vede le mie modifiche? Che cosa sto facendo di sbagliato?

+0

Hai capire perché? Ottengo la risposta qui sotto e funziona: 'Devi solo accedere al tuo contenitore mobile docker ed eseguire i tuoi comandi. Ma qual è la ragione per cui si comporta in questo [email protected] – lukik

risposta

36

È sufficiente accedere al contenitore della finestra mobile in esecuzione ed eseguire i comandi.

  1. costruire il tuo stack: docker-compose build -f path/to/docker-compose.yml
  2. lanciare il vostro stack: docker-compose up -f path/to/docker-compose.yml
  3. display docker contenitori in esecuzione: docker ps
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS       NAMES 
3fcc49196a84  ex_nginx   "nginx -g 'daemon off" 3 days ago   Up 32 seconds  0.0.0.0:80->80/tcp, 443/tcp ex_nginx_1 
66175bfd6ae6  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. Prendi il CONTAINER ID della tua app django e accedi a:
docker exec -t -i 66175bfd6ae6 bash 
  1. Ora si è connessi, poi andare alla cartella giusta: cd path/to/django_app

  2. E ora, ogni volta che si modifica i vostri modelli, eseguire nella vostra contenitore: python manage.py makemigrations e python manage.py migrate

vi consiglio anche di utilizzare uno scaricatore di porto-entrypoint per il Django file contenitore finestra mobile per l'esecuzione automatica:

  • collecstatic
  • migrano
  • runserver o avviarlo con gunicorn o uWSGI

Ecco un esempio (docker-entrypoint.sh):

#!/bin/bash 

# Collect static files 
echo "Collect static files" 
python manage.py collectstatic --noinput 

# Apply database migrations 
echo "Apply database migrations" 
python manage.py migrate 

# Start server 
echo "Starting server" 
python manage.py runserver 0.0.0.0:8000 
+4

* Inoltre, ti consiglio di utilizzare un punto di accesso docker per il file contenitore docker django per l'esecuzione automatica * - tali operazioni non dovrebbero mai essere eseguite automaticamente - in particolare * migriamo * in particolare. – Opal

+0

perché è quello? siamo nell'ambiente di sviluppo. –

+4

Non importa su quale ambiente sei: la distribuzione dovrebbe sempre avere lo stesso aspetto. Se le migrazioni sono automatizzate, è possibile eseguirle contemporaneamente che è altamente sconsigliato. Per esempio. su heroku: le migrazioni non vengono mai eseguite come parte della distribuzione. – Opal

17

io uso questi metodo:

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 

Usando docker gerarchia che abbiamo fatto, la migrazione servizio viene eseguito dopo aver impostato il backup del database e prima di eseguire il servizio principale. Ora quando esegui il servizio, docker eseguirà le migrazioni prima di eseguire il server; guarda che il server migration viene applicato sulla stessa immagine del server web, significa che tutte le migrazioni verranno prese dal tuo progetto, evitando problemi.

Si evita di fare il punto di ingresso o qualsiasi altra cosa con questo modo.

+0

Come funziona 'build: .' funziona con' image: 'Ricevo l'errore che la migrazione non è in grado di estrarre l'immagine con nome –

+0

L'ho risolto inserendo la funzione' build: 'on ' dal momento che verrà eseguito prima di 'web' –

0

Fili un po 'vecchi. Ma c'è un altro metodo non elencato finora.

Avere il proprio stack in esecuzione e sparare un comando di esecuzione di una finestra mobile compatta. Per esempio

#assume djsango in container named web 
docker-compose run web python3 manage.py migrate 

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

Problemi correlati