2015-11-30 6 views
34

Ich habe eine Docker Django/PostgreSQL App genau nach der Django Quick Start instructions on the Docker site eingerichtet.Wie führen Sie Django-Datenbankmigrationen bei Verwendung von Docker-Compose durch?

Das erste Mal, wenn ich Djangos manage.py migrieren, mit dem Befehl sudo docker-compose run web python manage.py migrate, funktioniert es wie erwartet. Die Datenbank ist in den Docker PostgreSQL Container eingebaut.

Änderungen, die an der Django-App selbst vorgenommen werden, spiegeln sich ebenfalls im Docker-Django-Container wider, sobald ich sie speichere. Es ist großartig!

Aber wenn ich dann ein Modell in Django ändern und versuchen, die Postgres-Datenbank auf das Modell zu aktualisieren, werden keine Änderungen festgestellt, so dass keine Migration passiert, egal wie oft ich makemigrations oder migrate erneut ausführen.

Grundsätzlich muss ich jedes Mal, wenn ich das Django-Modell ändere, die Docker-Container löschen (mit sudo docker-compose rm) und neu mit einer neuen Migration beginnen.

Ich versuche immer noch, meinen Kopf um Docker zu bekommen, und es gibt eine Menge, die ich nicht verstehe, wie es funktioniert, aber dieser macht mich verrückt. Warum migriert meine Änderungen nicht? Was mache ich falsch?

+0

Haben Sie herausfinden, warum? Ich bekomme die Antwort unten und es funktioniert: 'Sie müssen sich nur in Ihren laufenden Docker-Container einloggen und Ihre Befehle ausführen.aber was ist der Grund dafür, dass es sich so verhä[email protected] – lukik

Antwort

36

Sie müssen nur in Ihrem laufenden Docker Container anmelden und Ihre Befehle ausführen.

  1. Ihren Stack Körperbau: docker-compose build -f path/to/docker-compose.yml
  2. Starten Sie Ihren Stapel: docker-compose up -f path/to/docker-compose.yml
  3. Anzeige Docker Lauf Behälter: 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. Holen Sie sich das CONTAINER ID von Ihnen Django App und einloggen:
docker exec -t -i 66175bfd6ae6 bash 
  1. Nun sind Sie angemeldet sind, dann in den richtigen Ordner gehen: cd path/to/django_app

  2. Und jetzt, jedes Mal, wenn Sie Ihre Modelle bearbeiten, führen Sie in Ihrem Container: python manage.py makemigrations und python manage.py migrate

ich empfehle Sie auch automatisch ausführen, um einen docker-Einstiegspunkt für Ihre django docker-Container-Datei zu verwenden:

  • collecstatic
  • runserver wandern oder mit gunicorn starten oder uwsgi

Hier ist ein Beispiel (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

* Ich empfehle Ihnen auch, einen Docker-Einstiegspunkt für Ihre Django-Docker-Container-Datei zu verwenden, um automatisch zu laufen * - solche Operationen sollten niemals automatisch ausgeführt werden - ich meine * migrieren * besonders. – Opal

+0

warum ist das? Wir sind in der Entwicklungsumgebung. –

+4

Es spielt keine Rolle, in welcher Umgebung Sie sind - die Bereitstellung sollte immer gleich aussehen. Wenn Migrationen automatisiert sind, kann dies gleichzeitig ausgeführt werden, was sehr zu empfehlen ist. Z.B. auf Heroku - Migrationen werden niemals als Teil der Bereitstellung ausgeführt. – Opal

17

ich diese Methode verwenden:

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 

docker Hierarchie verwenden wir gemacht haben, läuft der Dienst Migration nach der Datenbank eingerichtet und vor dem Hauptdienst auszuführen. Wenn Sie nun Ihren Dienst ausführen, wird docker Migrationen ausführen, bevor der Server ausgeführt wird. schau, dass migration Server über das gleiche Bild wie der Webserver angewendet wird, bedeutet dies, dass alle Migrationen von Ihrem Projekt übernommen werden, um Probleme zu vermeiden.

Sie vermeiden gemachte Einstiegspunkt oder was auch immer anderes auf diese Weise.

+0

Wie funktioniert 'build: .' mit' image: 'Ich bekomme den Fehler, dass die Migration das benannte Bild nicht –

+0

ziehen kann Ich löste es, indem ich die' build: 'on' Migration 'da es vor' web' läuft –

0

Threads ein wenig alt. Aber da ist eine andere Methode, die bisher nicht aufgelistet ist.

Lassen Sie Ihren Stack laufen und feuern Sie dann einen One-Shot-Docker-Compose-Run-Befehl ab. Z. B

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

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

Verwandte Themen