Ich habe eine Docker Django / PostgreSQL-App eingerichtet, die den Anweisungen für den Django-Schnellstart auf der Docker-Site genau folgt .
Das erste Mal, wenn ich Djangos management.py migrate mit dem Befehl ausführe sudo docker-compose run web python manage.py migrate
, funktioniert es 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 toll!
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 erkannt, sodass keine Migration stattfindet, egal wie oft ich sie ausführe makemigrations
oder migrate
erneut.
Grundsätzlich muss ich jedes Mal, wenn ich das Django-Modell ändere, die Docker-Container löschen (mit sudo docker-compose rm
) und mit einer neuen Migration neu beginnen.
Ich versuche immer noch, mich mit Docker zu beschäftigen, und es gibt eine Menge, die 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?
quelle
You just have to log into your running docker container and run your commands.
Aber was ist der Grund, warum es sich so verhält? @ LouisBarranqueiroAntworten:
Sie müssen sich nur in Ihren laufenden Docker-Container einloggen und Ihre Befehle ausführen.
docker-compose build -f path/to/docker-compose.yml
docker-compose up -f path/to/docker-compose.yml
docker ps
Jetzt sind Sie angemeldet und gehen in den richtigen Ordner:
cd path/to/django_app
Und jetzt führen Sie jedes Mal, wenn Sie Ihre Modelle bearbeiten, in Ihrem Container aus:
python manage.py makemigrations
undpython manage.py migrate
Ich empfehle Ihnen außerdem, einen Docker-Einstiegspunkt zu verwenden, damit Ihre Django-Docker-Container-Datei automatisch ausgeführt wird:
Hier ist ein Beispiel (
docker-entrypoint.sh
):quelle
makemigrations
.migrate
Wenn ich das nächste Mal meinen Stack starte , wird die Datenbank mit den letzten rückgängig gemachten Migrationen aktualisiert, andernfalls funktioniert die Django-App nicht richtig ... Es ist nur eine Verknüpfung in dev env, um sicherzustellen, dass Sie das richtige Datenbankschema mit der aktuellen App habenIch benutze diese Methode:
Unter Verwendung der von
docker
uns erstellten Hierarchie wird die Dienstmigration nach dem Einrichten der Datenbank und vor dem Ausführen des Hauptdienstes ausgeführt. Wenn Sie jetzt Ihren Dienstdocker
ausführen, werden Migrationen ausgeführt, bevor der Server ausgeführt wird. Wenn dermigration
Server auf dasselbe Image wie der Webserver angewendet wird, bedeutet dies, dass alle Migrationen aus Ihrem Projekt übernommen werden, um Probleme zu vermeiden.Auf diese Weise vermeiden Sie den Einstiegspunkt oder was auch immer.
quelle
build: .
?image:
Ich erhalte die Fehlermeldung, dass die Migration das genannte Bild nicht abrufen kannbuild:
auf ,migration
da es vor laufenweb
Lassen Sie Ihren Stack laufen und starten Sie dann einen One-Shot-Docker-Compose-Run-Befehl. Z.B
Dies funktioniert hervorragend für die integrierte (Standard-) SQLite-Datenbank, aber auch für eine externe Docker-Datenbank, die als Abhängigkeit aufgeführt ist. Hier ist ein Beispiel für die Datei docker-compose.yaml
https://docs.docker.com/compose/reference/run/
quelle
Sie können den
docker exec
Befehl verwendenquelle
docker ps
die Spalte COMMAND for django server aus.Wenn Sie so etwas in Ihrem haben
docker-compose.yml
Dann können Sie einfach laufen ...
quelle
Ich weiß, dass dies alt ist, und vielleicht fehlt mir hier etwas (wenn ja, klären Sie mich bitte auf!), Aber warum nicht einfach die Befehle zu Ihrem
start.sh
Skript hinzufügen , das von Docker ausgeführt wird, um Ihre Instanz zu starten? Es dauert nur ein paar zusätzliche Sekunden.NB Ich habe die
DJANGO_SETTINGS_MODULE
Variable festgelegt, um sicherzustellen, dass die richtige Datenbank verwendet wird, da ich für die Entwicklung und Produktion unterschiedliche Datenbanken verwende (obwohl ich weiß, dass dies keine bewährte Methode ist).Das hat es für mich gelöst:
quelle
Bei Verwendung von Docker Exec wurde folgende Fehlermeldung angezeigt:
Also habe ich stattdessen diesen Befehl verwendet:
quelle