Maison  >  Article  >  développement back-end  >  Comment déboguer une application Python et Django dans un conteneur Docker

Comment déboguer une application Python et Django dans un conteneur Docker

王林
王林original
2024-08-06 20:21:10952parcourir

How to debug a Python and Django application inside a Docker container

Les montagnes russes d'émotions vécues lors du développement de systèmes sont quelque chose que toute personne y étant, même minimement exposée, peut affirmer avec force. Cependant, pour ceux qui ont une expérience significative dans divers projets et applications, construire un système à partir de zéro est souvent considéré comme la situation de rêve.

Le véritable cauchemar survient lorsque vous devez maintenir, prendre en charge ou faire évoluer un système existant et en cours d'exécution - avec parfois des milliers ou des millions d'utilisateurs. Et la couche la plus profonde de L'Enfer de Dante dans le développement logiciel est celle où vous devez déboguer le code pour résoudre un problème.

Je sais que parfois, surtout quand on débute, on s'appuie sur le print() le plus simple et le plus informel et ses équivalents dans d'autres langues. Pas de soucis, notre secret est en sécurité ici. Cependant, nous savons également que pour les bugs les plus douloureux et les plus délicats, nous devons utiliser un outil de débogage efficace, puissant et complet.

J'ai dû analyser certains problèmes de performance dans mon travail. Une enquête superficielle sur les retours de fonctions/classes ou le suivi du temps avec Grafana n'était pas suffisant pour trouver le vrai problème dans tout ce code enchevêtré. Alors... déboguons !

Débogage

En Python, nous avons PDB, une bibliothèque simple pour déboguer notre code. Pour l'utiliser, il vous suffit de l'installer à l'aide de pip. Par exemple :

pip install pdb 

Ajoutez ensuite une ligne dans le code que vous souhaitez déboguer :

import pdb; pdb.set_trace()

Ce sera votre point d'arrêt. Maintenant, vous pouvez réexécuter votre application et l'exécution sera suspendue juste après la ligne que vous venez d'ajouter. Vous pouvez ensuite parcourir votre code, ligne par ligne et fonction par fonction, pour trouver le problème que vous devez résoudre.

Avec Docker

La configuration ci-dessus devrait suffire pour un simple projet Python avec Django, Flask ou FastAPI. Cependant, si vous avez atteint ce point et que vous exécutez votre application dans un conteneur Docker et que vous rencontrez des problèmes, j'ai été sur le même chemin. Restez calme et suivez simplement ces prochaines étapes :

1 - Au lieu du PDB habituel, vous devez installer le débogueur distant. Exécutez-le dans votre conteneur Docker (ou incluez la bibliothèque dans votre gestionnaire de dépendances) :

pip install remote-pdb 

2 - Dans votre fichier docker-compose.yml, ajoutez un nouveau port pour exposer le point d'entrée PDB :

...
services:
  your-app:
    ...
    ports:
      - 8000:8000 # already existing port of your application
      - 4444:4444 # NEW LINE TO EXPOSE PDB PORT
    ...
...

3 - Toujours dans votre fichier docker-compose.yml, ajoutez ces deux lignes, pour permettre l'envoi de commandes depuis l'extérieur de Docker vers votre conteneur en cours d'exécution :

...
services:
  your-app:
    ...
    ports:
      - 8000:8000
      - 4444:4444
    stdin_open: true # THIS
    tty: true        # AND THIS
    ...
...

4 - Enfin, changez la ligne du point d'arrêt dans votre code par celle-ci :

__import__("remote_pdb").set_trace(host='0.0.0.0', port=4444)

Vous pouvez désormais également exécuter votre image Docker et vous connecter au débogueur PDB à partir du port 4444, que nous avons ouvert, à l'aide d'une simple commande telnet dans votre terminal préféré :

telnet 0.0.0.0 4444

Commandes PDB

Pour naviguer intelligemment dans la mer de votre code, vous devrez utiliser les commandes utiles fournies par PDB. Voyons quelques-uns d'entre eux ici :

J'utilise normalement simplement les commandes étape(s) et suivant (n). La différence entre les deux est que l'étape exécute chaque ligne, même celles à l'intérieur d'une fonction appelée sur la fonction actuelle. Et ensuite, exécutez uniquement les lignes à l'intérieur de la fonction actuelle, en attendant le retour des fonctions appelées.

Deux autres commandes utiles sont return (r), qui exécutent toute la fonction jusqu'à son retour, et continue (c), qui exécutent tout jusqu'au prochain point d'arrêt.

Conclusion

J'espère que ce contenu vous a été utile. En enquêtant sur un problème de performance important et en renforçant mon apprentissage lors de la rédaction de ce texte, je peux garantir que

"utiliser le bon outil pour le bon travail"

est quelque chose que nous ne devrions jamais oublier en tant que développeurs de logiciels. Cela peut élever nos carrières à un niveau plus efficace et apporter plus de joie à ce tour de montagnes russes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn