J'ai configuré une application Docker Django / PostgreSQL en suivant attentivement les instructions de démarrage rapide de Django sur le site Docker .
La première fois que j'exécute le manage.py migrate de Django, en utilisant la commande sudo docker-compose run web python manage.py migrate
, cela fonctionne comme prévu. La base de données est construite à l'intérieur du conteneur Docker PostgreSQL très bien.
Les modifications apportées à l'application Django elle-même sont également reflétées dans le conteneur Docker Django, au moment où je les enregistre. C'est bien!
Mais si je change ensuite un modèle dans Django et que j'essaie de mettre à jour la base de données Postgres pour qu'elle corresponde au modèle, aucun changement n'est détecté, donc aucune migration ne se produit, quel que soit le nombre de fois que j'exécute makemigrations
ou migrate
encore.
En gros, chaque fois que je change le modèle Django, je dois supprimer les conteneurs Docker (en utilisant sudo docker-compose rm
) et recommencer avec une nouvelle migration.
J'essaie toujours de comprendre Docker, et il y a beaucoup de choses que je ne comprends pas sur son fonctionnement, mais celui-ci me rend dingue. Pourquoi la migration ne voit-elle pas mes modifications? Qu'est-ce que je fais mal?
You just have to log into your running docker container and run your commands.
mais quelle est la raison pour laquelle cela se comporte de cette façon? @LouisBarranqueiroRéponses:
Il vous suffit de vous connecter à votre conteneur docker en cours d'exécution 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é, allez dans le bon dossier:
cd path/to/django_app
Et maintenant, chaque fois que vous modifiez vos modèles, exécutez-les dans votre conteneur:
python manage.py makemigrations
etpython manage.py migrate
Je vous recommande également d'utiliser un docker-entrypoint pour que votre fichier conteneur django docker s'exécute automatiquement:
Voici un exemple (
docker-entrypoint.sh
):la source
makemigrations
. la prochaine fois que je lancerai ma pile,migrate
mettra à jour la base de données avec les dernières migrations annulées, sinon l'application django ne fonctionnera pas correctement ... C'est juste un raccourci dans dev env pour être sûr que vous avez le bon schéma de base de données avec l'application actuelleJ'utilise ces méthodes:
En utilisant la
docker
hiérarchie que nous avons créée, la migration du service s'exécute après la configuration de la base de données et avant d'exécuter le service principal. Désormais, lorsque vous exécutez, votre servicedocker
exécutera des migrations avant d'exécuter le serveur; regardez que lemigration
serveur est appliqué sur la même image que le serveur Web, cela signifie que toutes les migrations seront prises à partir de votre projet, évitant ainsi les problèmes.Vous évitez ainsi de faire un point d'entrée ou quoi que ce soit d'autre.
la source
build: .
fonctionne avecimage:
J'obtiens l'erreur que la migration ne peut pas extraire l'image nomméebuild:
lemigration
car il fonctionnera avantweb
Faites fonctionner votre pile, puis lancez une commande d'exécution docker-compose en un seul coup. Par exemple
Cela fonctionne très bien pour la base de données SQLite intégrée (par défaut), mais également pour une base de données dockerisée externe répertoriée comme dépendance. Voici un exemple de fichier docker-compose.yaml
https://docs.docker.com/compose/reference/run/
la source
Vous pouvez utiliser la
docker exec
commandela source
docker ps
et recherchez la colonne COMMAND pour le serveur django.Si vous avez quelque chose comme ça dans votre
docker-compose.yml
Ensuite, vous pouvez exécuter simplement ...
la source
Je sais que c'est vieux, et peut-être qu'il me manque quelque chose ici (si oui, s'il vous plaît, éclairez-moi!), Mais pourquoi ne pas simplement ajouter les commandes à votre
start.sh
script, exécuté par Docker pour lancer votre instance? Cela ne prendra que quelques secondes supplémentaires.NB J'ai défini la
DJANGO_SETTINGS_MODULE
variable pour m'assurer que la bonne base de données est utilisée, car j'utilise différentes bases de données pour le développement et la production (bien que je sache que ce n'est pas la «meilleure pratique»).Cela a résolu le problème pour moi:
la source
En utilisant docker exec, j'obtenais l'erreur suivante:
J'ai donc utilisé cette commande à la place:
la source