Debugging Python in Docker: Ein Tutorial für AnfängerDebugging Python in Docker: Ein Tutorial für Anfänger
Bild von Autor | Ideogramm

# Einführung

Docker hat vereinfacht, wie wir Anwendungen entwickeln, versenden und ausführen, indem wir konsistente Umgebungen in verschiedenen Systemen bereitstellen. Diese Konsistenz enthält jedoch einen Kompromiss: Debugging wird für Anfänger täuschend komplex, wenn Ihre Anwendungen-einschließlich Python-Anwendungen-in Docker-Containern ausgeführt werden.

Für diejenigen, die neu in Docker sind, kann das Debuggen von Python -Anwendungen das Gefühl haben, ein Auto mit geschweißtem Kapuzen zu reparieren. Sie wissen, dass etwas nicht stimmt, aber Sie können nicht genau sehen, was drinnen passiert.

In diesem Anfänger-freundlichen Tutorial wird Ihnen beigebracht, wie Sie mit dem Debuggen von Python in Docker beginnen können.

# Warum ist Debugg in Docker anders?

Bevor wir eintauchen, verstehen wir, warum Docker das Debuggen schwierig macht. Wenn Sie Python lokal auf Ihrer Maschine ausführen, können Sie:

  • Siehe sofort Fehlermeldungen
  • Bearbeiten Sie Dateien und führen Sie sie erneut aus
  • Verwenden Sie Ihre bevorzugten Debugging -Instruments
  • Überprüfen Sie, welche Dateien vorhanden sind und was sich darin befindet

Aber wenn Python in einem Docker -Container läuft, ist es oft schwieriger und weniger direkt, besonders wenn Sie Anfänger sind. Der Container verfügt über ein eigenes Dateisystem, seine eigene Umgebung und seine eigenen laufenden Prozesse.

# Einrichten unseres Beispiels

Beginnen wir mit einem einfachen Python -Programm mit einem Fehler. Mach dir noch keine Sorgen um Docker. Lassen Sie uns zunächst verstehen, womit wir arbeiten.

Erstellen Sie eine Datei aufgerufen app.py:

def calculate_sum(numbers):
    whole = 0
    for num in numbers:
        whole += num
        print(f"Including {num}, whole is now {whole}")
    return whole

def foremost():
    numbers = (1, 2, 3, 4, 5)
    outcome = calculate_sum(numbers)
    print(f"Last outcome: {outcome}")
    
    # This line will trigger our program to crash!
    division_result = 10 / 0
    print(f"Division outcome: {division_result}")

if __name__ == "__main__":
    foremost()

Wenn Sie dies normalerweise mit laufen lassen python3 app.pySie werden sehen, dass es die Summe korrekt berechnet, aber dann mit einem „Teilung nach Null“ -Fehler abstürzt. Einfach zu erkennen und zu reparieren, oder?

Lassen Sie uns nun sehen, was passiert, wenn diese einfache Anwendung in einem Docker -Container ausgeführt wird.

# Erstellen Sie Ihren ersten Docker -Container

Wir müssen Docker sagen, wie er unser Python -Programm verpackt. Erstellen Sie eine Datei namens „Dockerfile“:

FROM python:3.11-slim

WORKDIR /app

COPY app.py .

CMD ("python3", "app.py")

Lassen Sie mich jede Zeile erklären:

  • FROM python:3.11-slim fordert Docker auf, mit einem vorgefertigten Linux-System zu beginnen, dessen bereits Python installiert hat
  • WORKDIR /app Erstellt im Container einen „/App“ -Fordner und legt ihn als Arbeitsverzeichnis fest
  • COPY app.py . kopiert Ihre app.py Datei von Ihrem Laptop in den Ordner „/App“ im Container
  • CMD ("python3", "app.py") Sagt Docker, welchen Befehl zum Ausführen des Containers erledigt werden soll

Lassen Sie uns nun diesen Behälter bauen und durchführen:

docker construct -t my-python-app .
docker run my-python-app

Sie werden die Ausgabe einschließlich des Fehlers sehen, aber dann stoppt der Container und verlässt. Dadurch werden Sie herausfinden, was im isolierten Behälter schief gelaufen ist.

# 1. Ausführen einer interaktiven Debugging -Sitzung

Die erste Debugging -Fähigkeit, die Sie benötigen, besteht darin, zu lernen, wie Sie in einen laufenden Container einsteigen und potenzielle Probleme überprüfen können.

Anstatt Ihr Python -Programm sofort auszuführen, starten wir den Container und erhalten Sie eine Eingabeaufforderung darin:

docker run -it my-python-app /bin/bash

Lassen Sie mich diese neuen Flaggen aufschlüsseln:

  • -i bedeutet „interaktiv“ – es hält den Eingabestream geöffnet, sodass Sie Befehle eingeben können
  • -t verteilt ein „pseudo-tty“-im Grunde genommen das Terminal ordnungsgemäß funktioniert
  • /bin/bash Überschreibt den normalen Befehl und gibt Ihnen stattdessen eine Bash -Shell

Nachdem Sie ein Terminal im Container haben, können Sie Befehle wie SO ausführen:

# See what listing you are in
pwd

# Record information within the present listing
ls -la

# Have a look at your Python file
cat app.py

# Run your Python program
python3 app.py

Sie werden auch den Fehler sehen:

root@fd1d0355b9e2:/app# python3 app.py
Including 1, whole is now 1
Including 2, whole is now 3
Including 3, whole is now 6
Including 4, whole is now 10
Including 5, whole is now 15
Last outcome: 15
Traceback (most up-to-date name final):
  File "/app/app.py", line 18, in 
    foremost()
  File "/app/app.py", line 14, in foremost
    division_result = 10 / 0
                      ~~~^~~
ZeroDivisionError: division by zero

Jetzt können Sie:

  • Bearbeiten Sie die Datei hier im Container (obwohl Sie zuerst einen Editor installieren müssen)
  • Erforschen Sie die Umgebung, um zu verstehen, was anders ist
  • Testen Sie kleine Code -Teile interaktiv

Beheben Sie die Abteilung durch Nullfehler (möglicherweise `10 / 0` auf` 10 / 2`), speichern Sie die Datei und führen Sie sie erneut aus.

Das Downside ist behoben. Wenn Sie den Container verlassen, verlieren Sie jedoch den Überblick über die von Ihnen vorgenommenen Änderungen. Dies bringt uns zu unserer nächsten Technik.

# 2. Volumenmontage für Reside -Änderungen

Wäre es nicht schön, wenn Sie Dateien auf Ihrem Laptop bearbeiten und diese Änderungen automatisch im Container angezeigt werden könnten? Genau das macht die Volumenmontage.

docker run -it -v $(pwd):/app my-python-app /bin/bash

Der neue Teil hier ist -v $(pwd):/app:

  • $(pwd) gibt den aktuellen Verzeichnispfad aus.
  • :/app ordnet Ihr aktuelles Verzeichnis auf /app im Behälter.
  • Jede Datei, die Sie auf Ihrem Laptop ändern, ändert sich sofort im Container.

Jetzt können Sie:

  1. Bearbeiten app.py Auf Ihrem Laptop mit Ihrem bevorzugten Editor
  2. Im Behälter laufen python3 app.py Um Ihre Änderungen zu testen
  3. Bearbeiten und testen Sie weiter, bis es funktioniert

Hier ist eine Beispielausgabe, nachdem der Divisor auf 2 geändert wurde:

root@3790528635bc:/app# python3 app.py
Including 1, whole is now 1
Including 2, whole is now 3
Including 3, whole is now 6
Including 4, whole is now 10
Including 5, whole is now 15
Last outcome: 15
Division outcome: 5.0

Dies ist nützlich, da Sie Ihre vertraute Bearbeitungsumgebung auf Ihrem Laptop und genau dieselbe Umgebung auch im Container verwenden können.

# 3.. Verbinden Sie einen entfernten Debugger aus Ihrer IDE

Wenn Sie eine integrierte Entwicklungsumgebung (ID) verwenden, wie Vs Code oder PycharmSie können den Debugger Ihrer IDE tatsächlich direkt an den Code anschließen, der in einem Docker -Container ausgeführt wird. Dies gibt Ihnen die volle Kraft der Debugging -Instruments Ihrer Ideen.

Bearbeiten Sie Ihre „Dockerfile“. SO:

FROM python:3.11-slim

WORKDIR /app

# Set up the distant debugging library
RUN pip set up debugpy

COPY app.py .

# Expose the port that the debugger will use
EXPOSE 5678

# Begin this system with debugger assist
CMD ("python3", "-m", "debugpy", "--listen", "0.0.0.0:5678", "--wait-for-client", "app.py")

Was das tut:

  • pip set up debugpy Installiert Microsoft Debugpy Bibliothek.
  • EXPOSE 5678 teilt Docker mit, dass unser Container Port 5678 verwendet.
  • Der CMD Startet unser Programm über den Debugger und hört Port 5678 für eine Verbindung an. Es sind keine Änderungen an Ihrem Python -Code erforderlich.

Bauen und führen Sie den Container aus:

docker construct -t my-python-app .
docker run -p 5678:5678 my-python-app

Der -p 5678:5678 Karten Sie Port 5678 vom Inneren des Containers zu Port 5678 auf Ihrem Laptop.

Jetzt im VS -Code können Sie eine Debug -Konfiguration einrichten (in .vscode/launch.json) um eine Verbindung zum Behälter herzustellen:

{
    "model": "0.2.0",
    "configurations": (
        {
            "title": "Python: Distant Connect",
            "sort": "python",
            "request": "connect",
            "join": {
                "host": "localhost",
                "port": 5678
            }
        }
    )
}

Wenn Sie mit dem Debuggen im VS -Code beginnen, wird eine Verbindung zu Ihrem Container hergestellt und Sie können Breakpoints festlegen, Variablen inspizieren und Code durchführen, genau wie Sie es mit lokalem Code tun würden.

# Häufige Debugging -Probleme und -Lösungen

⚠️ „Mein Programm funktioniert auf meinem Laptop, aber nicht in Docker“

Dies bedeutet normalerweise, dass es einen Unterschied in der Umwelt gibt. Überprüfen:

  • Python -Versionsunterschiede.
  • Fehlende Abhängigkeiten.
  • Verschiedene Dateipfade.
  • Umgebungsvariablen.
  • Dateiberechtigungen.

⚠️ „Ich kann meine Druckaussagen nicht sehen“

  • Verwenden python -u Um die Ausgabepufferung zu vermeiden.
  • Stellen Sie sicher, dass Sie mit laufen -it Wenn Sie eine interaktive Ausgabe wünschen.
  • Überprüfen Sie, ob Ihr Programm tatsächlich wie beabsichtigt ausgeführt wird (vielleicht austritt es früh).

⚠️ „Meine Änderungen werden nicht angezeigt“

  • Stellen Sie sicher, dass Sie Volumenmontage verwenden (-v).
  • Überprüfen Sie, ob Sie die richtige Datei bearbeiten.
  • Überprüfen Sie, ob die Datei in den Container kopiert wird.

⚠️ „Der Container verlässt sofort“

  • Rennen mit /bin/bash Um den Zustand des Behälters zu inspizieren.
  • Überprüfen Sie die Fehlermeldungen mit docker logs container_name.
  • Stellen Sie sicher, dass Ihre CMD in der Dockerfile ist korrekt.

# Abschluss

Sie haben jetzt ein grundlegendes Toolkit für das Debuggen von Python in Docker:

  1. Interaktive Schalen (docker run -it ... /bin/bash) zum Erkunden und schnellen Korrekturen
  2. Volumenmontage (-v $(pwd):/app) zur Bearbeitung in Ihrem lokalen Dateisystem
  3. Distant -Debugging für die Nutzung der vollständigen Fähigkeiten Ihrer IDE

Danach können Sie versuchen, Docker Compose für die Verwaltung komplexer Anwendungen zu verwenden. Beginnen Sie vorerst mit diesen einfachen Techniken. Die meisten Debugging -Probleme können gelöst werden, indem Sie in den Container einsteigen und herumstochern.

Der Schlüssel ist, methodisch zu sein: Verstehen Sie, was passieren sollte, finden Sie heraus, was tatsächlich passiert, und schließen Sie dann die Lücke zwischen den beiden. Joyful Debugging!

Bala Priya c ist ein Entwickler und technischer Schriftsteller aus Indien. Sie arbeitet gern an der Schnittstelle zwischen Mathematik, Programmierung, Datenwissenschaft und Inhaltserstellung. Ihre Interessensgebiete und Fachgebiete umfassen DevOps, Information Science und natürliche Sprachverarbeitung. Sie liest gerne, schreibt, codieren und Kaffee! Derzeit arbeitet sie daran, ihr Wissen mit der Entwicklergemeinschaft zu lernen und zu teilen, indem sie Tutorials, Anleitungen, Meinungsstücke und vieles mehr autorisiert. Bala erstellt auch ansprechende Ressourcenübersichten und Codierungs -Tutorials.



Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert