Docker vereinfacht die Anwendungsentwicklung, doch das Debugging von Python-Anwendungen in Containern kann für Anfänger eine Herausforderung darstellen. Dieser Artikel bietet eine schrittweise Anleitung, um diese Komplexität zu überwinden und effektive Debugging-Strategien für Python in Docker zu erlernen.
Warum ist Debugging in Docker anders?
Beim lokalen Debugging von Python können Sie Fehler sofort sehen, Dateien bearbeiten und Ihre bevorzugten Tools nutzen. In Docker-Containern ist der Zugriff auf das Dateisystem, die Umgebung und laufende Prozesse weniger direkt, was das Debugging erschwert.
Einrichtung unseres Beispiels
Zuerst erstellen wir eine einfache Python-Datei app.py mit einem Fehler:
def calculate_sum(numbers):
total = 0
for num in numbers:
total += num
print(f"Adding {num}, total is now {total}")
return total
def main():
numbers = [1, 2, 3, 4, 5]
result = calculate_sum(numbers)
print(f"Final result: {result}")
# Diese Zeile verursacht unseren Absturz!
division_result = 10 / 0
print(f"Division result: {division_result}")
if __name__ == "__main__":
main()
Wenn Sie dies lokal mit python3 app.py ausführen, sehen Sie einen ZeroDivisionError.
Erstellen Ihres ersten Docker-Containers
Erstellen Sie eine Dockerfile:
FROM python:3.11-slim
WORKDIR /app
COPY app.py .
CMD ["python3", "app.py"]
Bauen und führen Sie den Container aus:
docker build -t my-python-app .
docker run my-python-app
Der Container stoppt nach dem Fehler, was die Fehlersuche erschwert.
1. Ausführen einer interaktiven Debugging-Sitzung
Um in den Container zu gelangen, verwenden Sie:
docker run -it my-python-app /bin/bash
Innerhalb des Containers können Sie nun Befehle wie pwd, ls -la, cat app.py und python3 app.py ausführen, um das Problem zu analysieren. Sie können die Datei direkt im Container bearbeiten (erfordert die Installation eines Editors) oder den Fehler beheben und erneut ausführen.
2. Verwenden von Volume Mounting für Live-Edits
Um Änderungen auf Ihrem Computer sofort im Container zu sehen, nutzen Sie Volume Mounting:
docker run -it -v $(pwd):/app my-python-app /bin/bash
Die Option -v $(pwd):/app verknüpft Ihr aktuelles Verzeichnis mit /app im Container. Bearbeiten Sie app.py lokal und führen Sie sie im Container erneut aus, um die Änderungen zu testen.
3. Verbinden eines Remote-Debuggers von Ihrer IDE
Für fortgeschrittene Debugging-Funktionen können Sie Ihre IDE (z.B. VS Code) mit dem Container verbinden. Ändern Sie Ihre Dockerfile:
FROM python:3.11-slim
WORKDIR /app
RUN pip install debugpy
COPY app.py .
EXPOSE 5678
CMD ["python3", "-m", "debugpy", "--listen", "0.0.0.0:5678", "--wait-for-client", "app.py"]
Bauen und führen Sie den Container aus und mappen Sie den Port:
docker build -t my-python-app .
docker run -p 5678:5678 my-python-app
Konfigurieren Sie dann Ihre IDE (z.B. mit .vscode/launch.json in VS Code) für Remote-Anhang an localhost:5678. Dies ermöglicht das Setzen von Breakpoints und die Inspektion von Variablen direkt aus Ihrer IDE.
Häufige Debugging-Probleme und Lösungen
- Programm funktioniert lokal, aber nicht in Docker: Überprüfen Sie Unterschiede in Python-Versionen, fehlende Abhängigkeiten, Dateipfade, Umgebungsvariablen oder Dateiberechtigungen.
- Print-Anweisungen nicht sichtbar: Verwenden Sie
python -uund stellen Sie sicher, dass Sie mit-itausführen. - Änderungen werden nicht übernommen: Stellen Sie sicher, dass Volume Mounting verwendet wird und Sie die richtige Datei bearbeiten.
- Container wird sofort beendet: Nutzen Sie
/bin/bashzur Inspektion, prüfen Siedocker logsund verifizieren Sie dieCMDin derDockerfile.
Fazit
Mit interaktiven Shells, Volume Mounting und Remote-Debugging verfügen Sie über ein grundlegendes Werkzeugset für das Debugging von Python in Docker. Diese Techniken helfen Ihnen, Probleme systematisch zu identifizieren und zu beheben.