webentwicklung-frage-antwort-db.com.de

Wie führen Sie Django Datenbankmigrationen mit Docker-Compose durch?

Ich habe eine Docker Django/PostgreSQL-App eingerichtet, die genau den Django-Schnellstartanweisungen auf der Docker-Site folgt .

Das erste Mal, dass ich Django's manage.py migrate mit dem Befehl Sudo docker-compose run web python manage.py migrate, es funktioniert wie erwartet. Die Datenbank ist in den Docker PostgreSQL Container integriert.

Änderungen an der Django App selbst werden ebenfalls im Docker Django Container angezeigt, sobald ich sie speichere. Es ist großartig!

Wenn ich dann ein Modell in Django ändere und versuche, die Postgres-Datenbank so zu aktualisieren, dass sie mit dem Modell übereinstimmt, werden keine Änderungen festgestellt, sodass keine Migration erfolgt, egal wie oft ich makemigrations oder migrate ausführe. nochmal.

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

Ich versuche immer noch, mich mit Docker zu beschäftigen, und es gibt eine Menge, von denen ich nicht verstehe, wie es funktioniert, aber diese macht mich verrückt. Warum werden meine Änderungen bei der Migration nicht angezeigt? Was mache ich falsch?

68
John

Sie müssen sich nur bei Ihrem Docker-Container anmelden und Ihre Befehle ausführen.

  1. Bauen Sie Ihren Stapel: docker-compose build -f path/to/docker-compose.yml
  2. Starte deinen Stack: docker-compose up -f path/to/docker-compose.yml
  3. Docker mit Containern anzeigen: 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 die CONTAINER ID von Ihnen Django App und melden Sie sich an:
docker exec -t -i 66175bfd6ae6 bash
  1. Jetzt bist du eingeloggt und geh in den richtigen Ordner: cd path/to/Django_app

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

Ich empfehle Ihnen auch, einen Docker-Entypoint zu verwenden, damit Ihre Django Docker-Containerdatei automatisch ausgeführt wird:

  • kollektiv
  • migrieren
  • runserver oder starte es mit gunicorn 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
66

Ich benutze diese Methode:

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

Unter Verwendung der von uns erstellten docker -Hierarchie wird die Dienstmigration ausgeführt, nachdem die Datenbank eingerichtet wurde und bevor der Hauptdienst ausgeführt wird. Wenn Sie jetzt Ihren Dienst ausführen, führt docker Migrationen durch, bevor der Server ausgeführt wird. Stellen Sie sicher, dass migration server auf dasselbe Image angewendet wird wie der Webserver. Dies bedeutet, dass alle Migrationen aus Ihrem Projekt übernommen werden, um Probleme zu vermeiden.

Auf diese Weise vermeiden Sie einen Einstiegspunkt oder was auch immer.

37
SalahAdDin

Lassen Sie Ihren Stack laufen und starten Sie dann einen einmaligen Docker-Compose-Run-Befehl. Z.B

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

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

22
Oliver Shaw

Sie können docker exec Befehl

docker exec -it container_id python manage.py migrate
2
SuperNova

Ich weiß, dass dies alt ist, und vielleicht fehlt hier etwas (wenn ja, bitte klären Sie mich auf!), Aber warum fügen Sie nicht einfach die Befehle zu Ihrem start.sh - Skript hinzu, das von Docker ausgeführt wird, um Ihre Instanz zu starten? Es dauert nur ein paar zusätzliche Sekunden.

N.B. Ich habe die Variable Django_SETTINGS_MODULE Gesetzt, um sicherzustellen, dass die richtige Datenbank verwendet wird, da ich verschiedene Datenbanken für die Entwicklung und Produktion verwende (obwohl ich weiß, dass dies nicht die beste Vorgehensweise ist).

Das hat es für mich gelöst:

#!/bin/bash
# Migrate the database first
echo "Migrating the database before starting the server"
export Django_SETTINGS_MODULE="edatool.settings.production"
python manage.py makemigrations
python manage.py migrate
# Start Gunicorn processes
echo "Starting Gunicorn."
exec gunicorn edatool.wsgi:application \
    --bind 0.0.0.0:8000 \
    --workers 3
1
TBZ92