Comment procédez-vous pour Django migrations de base de données lors de l'utilisation de Docker-Composer?
J'ai mis en place un Panneau de Django/PostgreSQL app étroitement à la suite de la Django instructions de Démarrage Rapide sur le Panneau site.
La première fois que j'utilise Django manage.py la migration, à l'aide de la commande sudo docker-compose run web python manage.py migrate
, il fonctionne comme prévu. La base de données est construite à l'intérieur du Panneau de PostgreSQL récipient bien.
Les modifications apportées à la Django app lui-même, sont également reflétés dans le Panneau de Django conteneur, du moment où je les sauver. C'est génial!
Mais si je puis modifiez un modèle dans Django, et essayez de mettre à jour la base de données Postgres pour correspondre le modèle, aucune modification n'est détectée, donc pas de migration qui se passe, peu importe combien de fois je exécuter makemigrations
ou migrate
de nouveau.
Fondamentalement, chaque fois que je change le modèle Django, j'ai supprimer les conteneurs Docker (à l'aide de sudo docker-compose rm
) et de repartir à zéro avec une nouvelle migration.
Je suis encore à essayer d'obtenir ma tête autour de Docker, et il y a énormément de choses que je ne comprends pas comment il fonctionne, mais c'est me rend fou. Pourquoi ne pas migrer voir mon évolution? Ce que je fais mal?
- Avez-vous comprendre pourquoi? Je reçois la réponse ci-dessous et ça fonctionne:
You just have to log into your running docker container and run your commands.
mais quelle est la raison qui fait qu'il se comporte de cette façon? @LouisBarranqueiro
Vous devez vous connecter pour publier un commentaire.
Vous avez juste à vous connecter à votre panneau de conteneurs et d'exécuter vos commandes.
docker-compose build -f path/to/docker-compose.yml
docker-compose up -f path/to/docker-compose.yml
docker ps
Maintenant que vous êtes connecté, puis allez dans le dossier de droite :
cd path/to/django_app
Et maintenant, chaque fois que vous modifiez vos modèles, exécutez dans votre conteneur :
python manage.py makemigrations
etpython manage.py migrate
Moi aussi je vous recommande d'utiliser un menu fixe-point d'entrée pour votre django docker conteneur de fichier pour l'exécuter automatiquement :
Voici un exemple (
docker-entrypoint.sh
) :makemigrations
. la prochaine fois que je lance ma pile,migrate
sera mise à jour de la base de données avec les dernières migrations annulée, sinon django app ne fonctionne correctement... Il a juste un raccourci dans le dev env pour être sûr que vous avez obtenu le bon schéma de base de données avec l'application en coursNo changes detected
, même si l'application plante manque des champs de la table qui signifie qu'il y a des changements. Je vais peut-être recommencer à zéro, dans le cas de mon dernier expériences jeté les migrations hors de la synchronisation. De toute façon, une petite question: ne devrait-il pas #2 '-d' elle, il s'exécute en arrière-plan lorsque je reçois le n ° 4? Je vais essayer votre point d'entrée maintenant, même si j'ai peur, si makemigrations est pas vu de changements, j'ai l'habitude d'obtenir tout les migrations au démarrage de toute façon. Les autres qu'il ne fonctionne pas pour moi encore, c'est une très belle réponse!-d
drapeau, oui, vous pouvez l'ajouter à utiliser la même fenêtre de terminal :D, sinon, il vous suffit d'ouvrir une autre fenêtre pour exécuter les commandes suivantes. 🙂 Pourriez-vous ajouter votredocker-compose.yml
fichier? Êtes-vous sûr que votre code est dans un volume utilisé par votre django conteneur?J'utilise cette méthode:
À l'aide de
docker
hiérarchie que nous avons fait, le service de migration s'exécute après avoir configuré la base de données avant d'exécuter le service principal. Maintenant, lorsque vous exécutez votre servicedocker
va exécuter les migrations avant s'exécute le serveur; look quimigration
serveur est appliqué au cours de la même image que serveur web, cela signifie que toutes les migrations seront prises à partir de votre projet, d'éviter les problèmes.Vous évitez fait point d'entrée ou de quelque autre chose de cette manière.
build: .
travailler avecimage:
je reçois le message d'erreur que la migration ne pouvez pas tirer le nom de l'imagebuild:
surmigration
puisqu'il sera exécuté avantweb
Threads un peu vieux. Mais il y a une autre méthode qui n'est pas répertorié jusqu'à présent.
Avoir votre tapis de course puis de déclencher un one shot docker-composer de la commande exécuter. E. g
https://docs.docker.com/compose/reference/run/
Vous pouvez utiliser
docker exec
commandeJe sais que c'est vieux, et peut-être que je manque quelque chose ici (si oui, merci de m'éclairer!), mais pourquoi ne pas simplement ajouter les commandes à votre
start.sh
script, exécutez par Docker à feu vers le haut de votre instance? Cela ne prendra que quelques secondes supplémentaires.N. B. j'ai mis le
DJANGO_SETTINGS_MODULE
variable assurez-vous que la base de données utilisée, comme je l'ai utiliser différentes bases de données pour le développement et la production (même si je sais que ce n'est pas la "meilleure pratique").Cela a résolu pour moi: