2017-09-30 19 views
1

Je cours mon application django en utilisant docker compose. Ngninx et gunicorn sont exécutés via supervisor.Utilisation de pdb avec le superviseur

Cependant, je n'arrive pas à comprendre comment déboguer en utilisant pdb. Quand je l'utilise:

import pdb 
pdb.set_trace() 

Après avoir exécuté la commande docker-compose up, mon application et base de données commencent à courir et l'écran du terminal reste actif en attente de sortie supplémentaire pour afficher.

Lorsque mon code atteint pdb.set_trace(), le terminal susmentionné reste tel quel mais l'interface (pdb) n'apparaît pas.

Est-ce que quelqu'un pourrait savoir comment je pourrais déboguer mon application en utilisant pdb? Y a-t-il autre chose que je dois utiliser?

Merci.

Mise à jour

docker-compose.yml

version: '3' 

services: 
    db: 
    image: mysql/mysql-server:latest 
    container_name: my_container_name 
    ports: 
     - "3306:3306" 
    environment: 
     MYSQL_DATABASE: "mydb" 
     MYSQL_USER: "myusername" 
     MYSQL_PASSWORD: "mypass" 
     MYSQL_ROOT_PASSWORD: "mypass" 
     MYSQL_ALLOW_EMPTY_PASSWORD: "yes" 
    command: mysqld 

    web: 
    build: . 
    container_name: my_container_name 
    ports: 
     - "9000:9000" 
    depends_on: 
     - db 

supervisord.conf

[supervisord] 
nodaemon=true 

[program:nginx] 
command=/usr/sbin/nginx 

[program:djangoserver] 
command=python /myapp/djangorest/manage.py runserver localhost:8000 
stdin_open: true 
tty: true 
+1

Vous exécutez le superviseur en tant que PID 1, cette approche ne fonctionnera pas. Vous devez utiliser des conteneurs séparés pour nginx et djnagoserver –

+0

@TarunLalwani Merci pour cela. Finalement, il a fonctionné après la séparation des conteneurs. – leon

Répondre

1

Si vous voulez déboguer alors vous devrez prendre gunicorn hors de l'image et de lancer directement django à l'aide django manage.py runserver.

Gunicorn lance des threads ou des processus en arrière-plan et il est difficile de les attacher à leur stdin. Donc, vous voulez que le PID principal 1 ait le stdin et s'attache au même. Vous aurez besoin de faire changer à votre docker-compose.yml et ajoutez ci-dessous des paramètres à votre service django

command: python manage.py runserver 0.0.0.0:8000 
stdin_open: true 
tty: true 

Alors docker-compose ne permet pas de se connecter à stdin, vous devez lancer le même en mode détaché

docker-compose up -d 

Après que vous souhaitez vous connecter au conteneur django utilisant docker directement

docker attach <project>_<djangocontainername>_1 

Ensuite, lorsque vous debug le terminal (pdb) affichera

+0

Merci Tarun. Quand je le fais de cette façon, la sortie indique que le djangoserver est en cours d'exécution mais en réalité cela ne semble pas être le cas (quand je lance mon application, ça ne marche pas - je dois exécuter manuellement la commande 'runserver' dans le récipient). Savez-vous pourquoi cela pourrait être? – leon

+0

Mettre à jour le dernier docker-composer que vous avez utilisé dans la question –

+0

J'ai mis à jour ma réponse avec mes derniers fichiers. S'il vous plaît noter: Si je déplace les 'commande',' stdin' et 'tty' à' docker-compose.yml', alors je reçois une erreur indiquant 'django.db.utils.OperationalError: (1130," Host '172.18. 0.3 'n'est pas autorisé à se connecter à ce serveur MySQL ")'. PS: J'ai accidentellement édité votre réponse - j'espère que vous ou quelqu'un d'autre pouvez rejeter la modification. – leon