2017-09-30 4 views
1

Ich verwende meine Django-App mit docker compose. Ngninx und gunicorn werden über ausgeführt.Verwenden von pdb mit Supervisor

Allerdings kann ich nicht herausfinden, wie Sie mit pdb debuggen. Wenn ich benutze:

import pdb 
pdb.set_trace() 

Nach dem Ausführen des Befehls docker-compose up, meine App und Datenbank beginnen aktiv zu laufen und der Terminal-Bildschirm bleibt wartet auf weitere Ausgabe anzuzeigen.

Wenn mein Code pdb.set_trace() erreicht, bleibt das oben erwähnte Terminal unverändert, aber die Schnittstelle (pdb) erscheint nicht.

Würde jemand wissen, wie ich meine Anwendung mit pdb debuggen könnte? Gibt es noch etwas, das ich benutzen muss?

Vielen Dank.

aktualisieren

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

Sie führen Supervisor als PID 1, dieser Ansatz wird nicht funktionieren. Sie müssen separate Container für nginx und djnagoserver verwenden –

+0

@TarunLalwani Vielen Dank dafür. Endlich funktionierte es nach dem Trennen der Container. – leon

Antwort

1

Wenn Sie müssen, um debuggen wollen, dann Sie aus Bild gunicorn und direkt django starten django manage.py runserver verwenden.

Gunicorn wird Threads oder Prozesse im Hintergrund starten und es ist schwierig, sie an ihre Standarddatei anzuhängen. Sie möchten also, dass die Haupt-PID 1 die Standardeingabe hat und an dieselbe anfügt. Sie müssen geändert machen, damit Ihre docker-compose.yml und fügen Sie unter Parameter Ihren django Service

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

Dann docker-compose nicht zu stdin verbinden, so müssen Sie die gleiche in freistehenden Modus starten

docker-compose up -d 

Danach möchten Sie den django Behälter

docker attach <project>_<djangocontainername>_1 

Dann, wenn Sie Debug mit docker direkt verbinden Der (pdb) Terminal zeigt

+0

Danke Tarun. Wenn ich es so mache, gibt die Ausgabe an, dass der djangoserver läuft, aber in Wirklichkeit scheint es nicht zu sein (wenn ich meine App laufe, funktioniert es nicht - ich muss den 'runserver' Befehl innerhalb der Container). Würdest du wissen, warum das so sein könnte? – leon

+0

Aktualisiere das letzte Docker-Compose, das du in der Frage benutzt hast –

+0

Ich habe meine Antwort mit meinen neuesten Dateien aktualisiert. Bitte beachten Sie: Wenn ich 'command',' stdin' und 'tty' in' docker-compose.yml' verschiebe, erhalte ich einen Fehler mit dem Hinweis 'django.db.utils.OperationalError: (1130," Host '172.18. 0.3 'darf sich nicht mit diesem MySQL Server verbinden "). PS: Ich habe deine Antwort versehentlich bearbeitet - hoffentlich kannst du oder jemand anders die Bearbeitung ablehnen. – leon