Pourquoi suis-je incapable d'exécuter django migrations par le biais du menu fixe-composer exécuter web de "commande"?
Donc je suis le déploiement de django, postgress et nginx conteneurs via docker-composer et j'ai un problème que je n'arrive pas à comprendre.
Afin de résoudre l'erreur suivante dans mon Django app, je savais que j'ai juste eu à exécuter un Django migration.
docker@postgres ERROR: relation "accounts_myprofile" does not exist
Dans une tentative d'exécuter les migrations, j'ai essayé:
docker-compose run web python manage.py makemigrations
docker-compose run web python manage.py migrate
qui a renvoyé l'suivantes:
Migrations for 'accounts':
accounts/migrations/0001_initial.py:
- Create model Entry
- Create model MyProfile
Running migrations:
No migrations to apply.
Je n'ai pu réussir à migrer à partir de l'intérieur de l'Django conteneur, par exemple:
docker exec -i -t 6dc97c6a305c /bin/bash
python manage.py makemigrations
python manage.py migrate
Bien que j'ai résolu le problème, je ne comprends toujours pas pourquoi l'exécution de l'migrer via docker-composition de l'exécuter ne fait pas migrer rien. J'espère que quelqu'un pourra peut-être me diriger dans la bonne direction.
Aussi, je ne sais pas si c'est un problème lié ou pas, mais quand je lance ces docker-composition de web exécuter les commandes, ils semblent être la création de nouvelles des conteneurs qui ne sont pas l'arrêt à moins que j'ai arrêter manuellement, docker-composition de cesser de ne pas les supprimer.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7bb3c7106d1 accounts_web "python manage.py che" 4 hours ago Restarting (0) 41 minutes ago 8000/tcp accounts_web_run_62
ee19ca6cdf49 accounts_web "python manage.py mig" 4 hours ago Restarting (0) 43 minutes ago 8000/tcp accounts_web_run_60
2d87ee35de3a accounts_web "python manage.py mak" 4 hours ago Restarting (0) 43 minutes ago 8000/tcp accounts_web_run_59
1c6143c13097 accounts_web "python manage.py mig" 4 hours ago Restarting (1) 44 minutes ago 8000/tcp accounts_web_run_58
6dc97c6a305c b1cb7debb103 "python manage.py run" 3 days ago Up 4 hours 8000/tcp accounts_web_1
Remarque: Docker-composer un arrêt bien arrêter le récipient au fond (comme il se doit), mais les autres conteneurs qui ont été créés par docker-composition de web exécuter python manage.py migrer, devra être arrêté manuellement.
mon menu fixe-composer
web:
restart: always
build: ./web
expose:
- "8000"
links:
- postgres:postgres
volumes:
- /usr/src/app
- /usr/src/app/static
env_file: .env
environment:
DEBUG: 'true'
command: python manage.py runserver 0.0.0.0:8000
postgres:
restart: always
image: kartoza/postgis:9.4-2.1
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data/
OriginalL'auteur david | 2017-01-03
Vous devez vous connecter pour publier un commentaire.
docker-composer crée de nouveaux conteneurs
Vous l'avez déjà remarqué le problème. Lorsque vous utilisez
docker-compose run
, un nouveau conteneur est créé.Lors de l'exécution de la première commande (makemigrations), un nouveau conteneur a été créé, makemigrations couru, et les fichiers de migration ont été écrits sur le (nouveau) du conteneur de système de fichiers.
Lors de l'exécution de la deuxième commande (migrer), un autre nouveau conteneur a été créé. La migration a couru, mais il n'avait rien à faire. C'est parce que les fichiers de migration n'étaient pas disponibles, ils ont été écrits dans un autre récipient que cette nouvelle.
Vous pouvez résoudre ce problème dans un couple des manières.
À l'aide de docker-composer exec
Tout d'abord, vous pouvez faire ce que vous l'avez déjà fait, mais l'utilisation
docker-compose exec
au lieu derun
.exec
va utiliser la déjà en cours d'exécution conteneur, plutôt que de créer de nouveaux conteneurs.À l'aide d'un point d'entrée script
Une autre option est d'utiliser un point d'entrée script et exécutez la migration, avant que le serveur est démarré. C'est la voie à suivre si vous préférez des choses plus automatique.
Dockerfile:
entrypoint.sh:
docker-composer.yml (sous "web"):
Dans ce scénario, lorsque le conteneur démarre, le point d'entrée script sera exécuté, la poignée de la migration, puis de s'en remettre à la
command
(qui dans ce cas est de Djangorunserver
).Les nouveaux conteneurs boucle pour toujours
Comme vous l'avez remarqué, les nouveaux conteneurs de séjour en cours d'exécution. Qui, normalement, est inattendu, parce que vous annulé la commande avec un qui doit quitter (plutôt que de rester en cours d'exécution). Toutefois, dans le menu fixe-composer.yml, vous avez spécifié
restart: always
. Donc, ils vont exécuter la migration des commandes de plus de et plus, de redémarrer à chaque fois que la commande ferme.Mais si vous utilisez un entrypoint.sh fichier comment pouvez-vous faire des choses comme python manage.py createsuperuser, ces commandes sont ignorées
Vous pouvez le faire dans le point d'entrée de script. Mais dans ce cas, vous devez le faire de différentes de la normale, parce que cette commande va attendre d'entrée. Voir cette réponse qui pourrait aider à cette tâche.
Vous pouvez faire de la création de la super-utilisateur, une partie de votre migrations par l'écriture d'une Migration de Données, voir here @JesusAlmaral
OriginalL'auteur Dan Lowe