Heim  >  Artikel  >  Backend-Entwicklung  >  So debuggen Sie eine Python- und Django-Anwendung in einem Docker-Container

So debuggen Sie eine Python- und Django-Anwendung in einem Docker-Container

王林
王林Original
2024-08-06 20:21:10951Durchsuche

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

Die Achterbahn der Gefühle, die man bei der Entwicklung von Systemen erlebt, kann jeder mit Nachdruck behaupten, der auch nur minimal damit in Berührung gekommen ist. Für diejenigen mit umfangreicher Erfahrung in verschiedenen Projekten und Anwendungen wird der Aufbau eines Systems von Grund auf jedoch oft als Traumsituation angesehen.

Der wahre Albtraum entsteht, wenn Sie ein bestehendes und laufendes System warten, unterstützen oder weiterentwickeln müssen – manchmal mit Tausenden oder Millionen von Benutzern. Und die tiefste Ebene von The Inferno of Dante in der Softwareentwicklung ist, wenn Sie den Code debuggen müssen, um ein Problem zu beheben.

Ich weiß, dass man sich manchmal, besonders wenn man gerade erst anfängt, auf das einfachste und informellste print() und dessen Äquivalente in anderen Sprachen verlässt. Keine Sorge, unser Geheimnis ist hier sicher. Wir wissen jedoch auch, dass wir für die schmerzhaftesten und kniffligsten Fehler ein effizientes, leistungsstarkes und umfassendes Debugging-Tool verwenden müssen.

Ich musste einige Leistungsprobleme in meiner Arbeit analysieren. Eine oberflächliche Untersuchung der Funktions-/Klassenrückgaben oder der Zeitverfolgung mit Grafana war nicht ausreichend, um das eigentliche Problem in all dem verworrenen Code zu finden. Also... lasst uns debuggen!

Debuggen

In Python haben wir PDB, eine unkomplizierte Bibliothek zum Debuggen unseres Codes. Um es zu verwenden, müssen Sie es lediglich mit pip installieren. Zum Beispiel:

pip install pdb 

Dann fügen Sie eine Zeile in den Code ein, den Sie debuggen möchten:

import pdb; pdb.set_trace()

Dies wird Ihr Haltepunkt sein. Jetzt können Sie Ihre Anwendung erneut ausführen. Die Ausführung wird direkt nach der gerade hinzugefügten Zeile angehalten. Sie können dann Ihren Code Schritt für Schritt durchgehen, Zeile für Zeile und Funktion für Funktion, um das Problem zu finden, das Sie beheben müssen.

Mit Docker

Das obige Setup sollte für ein einfaches Python-Projekt mit Django, Flask oder FastAPI ausreichen. Wenn Sie jedoch an diesem Punkt angelangt sind und Ihre Anwendung in einem Docker-Container ausführen und auf Probleme stoßen, bin ich auf dem gleichen Weg. Bleiben Sie ruhig und folgen Sie einfach diesen nächsten Schritten:

1 – Anstelle des üblichen PDB sollten Sie den Remote-Debugger installieren. Führen Sie es in Ihrem Docker-Container aus (oder fügen Sie die Bibliothek in Ihren Abhängigkeitsmanager ein):

pip install remote-pdb 

2 – Fügen Sie in Ihrer docker-compose.yml-Datei einen neuen Port hinzu, um den PDB-Einstiegspunkt verfügbar zu machen:

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

3 – fügen Sie noch in Ihrer docker-compose.yml-Datei diese beiden Zeilen hinzu, um das Senden von Befehlen von außerhalb von Docker an Ihren laufenden Container zu ermöglichen:

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

4 – Abschließend ändern Sie die Haltepunktzeile in Ihrem Code in diese:

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

Jetzt können Sie auch Ihr Docker-Image ausführen und eine Verbindung mit dem PDB-Debugger über Port 4444 herstellen, den wir geöffnet haben, indem Sie einen einfachen Telnet-Befehl in Ihrem Lieblingsterminal verwenden:

telnet 0.0.0.0 4444

PDB-Befehle

Um geschickt durch das Meer Ihres Codes zu navigieren, müssen Sie die von PDB bereitgestellten hilfreichen Befehle verwenden. Sehen wir uns einige davon hier an:

Normalerweise verwende ich einfach die Befehle Schritt (s) und nächster (n). Der Unterschied zwischen beiden besteht darin, dass Schritt jede Zeile ausführt, auch diejenigen innerhalb einer Funktion, die in der aktuellen aufgerufen wird. Und als nächstes führen Sie nur die Zeilen innerhalb der aktuellen Funktion aus und warten auf die Rückkehr der aufgerufenen Funktionen.

Weitere zwei nützliche Befehle sind return (r), die die gesamte Funktion ausführen, bis sie zurückkehrt, und continue (c), die alles bis zum nächsten Haltepunkt ausführen.

Abschluss

Ich hoffe, dieser Inhalt war hilfreich für Sie. Durch die Untersuchung eines erheblichen Leistungsproblems und die Vertiefung meines Lernens beim Schreiben dieses Textes kann ich dies garantieren

„Das richtige Werkzeug für die richtige Aufgabe verwenden“

ist etwas, das wir als Softwareentwickler nie vergessen sollten. Es kann unsere Karriere auf ein effektiveres Niveau heben und mehr Freude bereiten in diese Achterbahnfahrt.

Das obige ist der detaillierte Inhalt vonSo debuggen Sie eine Python- und Django-Anwendung in einem Docker-Container. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn