2017-05-28 3 views
2

Ich habe diesen ersten Docker Container gemacht, und es funktioniert nach der Dockerfile.debuggen containerisierte Python Web App

FROM python:3.5-slim 

RUN apt-get update && \ 
    apt-get -y install gcc mono-mcs && \ 
     apt-get -y install vim && \ 
     apt-get -y install nano && \ 
      rm -rf /var/lib/apt/lists/* 

RUN mkdir -p /statics/js 

VOLUME ["/statics/"] 

WORKDIR /statics/js 

COPY requirements.txt /opt/requirements.txt 

RUN pip install -r /opt/requirements.txt 

EXPOSE 8080 

CMD ["python", "/statics/js/app.py"] 

nach Ausführung dieses Befehls:

docker run -it -p 8080:8080 -v ~/Development/my-Docker-builds/pythonReact/statics/:/statics/ -d ciasto/pythonreact:v2

und wenn ich die Seite öffnen localhost:8080 i erhalten Fehler:

A server error occurred. Please contact the administrator. 

aber wenn ich this application normal laufen, also nicht direkt containerisiert auf meinem Host-Maschine: Es funktioniert gut.

Also ich möchte wissen, was verursacht Serverfehler. Wie debugge ich eine Python-App, die über einen Container ausgeführt wird, um zu wissen, was die Ursache dafür ist, dass sie nicht funktioniert. oder was mache ich falsch.

Antwort

1

Vor allem diese:

config.paths['static_files'] = 'statics' 

Sollte sein:

config.paths['static_files'] = '/statics' 

ich Ihre Anwendung und läuft mit 'Hallo Welt'

Haben diese Veränderungen haben :

1) Die erwähnt config.paths['static_files'] = '/statics'

2) Diese Dockerfile (entfernt VOLUME)

FROM python:3.5-slim 

RUN apt-get update && \ 
    apt-get -y install gcc mono-mcs && \ 
    apt-get -y install vim && \ 
    apt-get -y install nano && \ 
     rm -rf /var/lib/apt/lists/* 

COPY requirements.txt /opt/requirements.txt 

RUN pip install -r /opt/requirements.txt 

COPY ./statics/ /statics/ 
COPY app.py /app/app.py 
WORKDIR /statics/js 

EXPOSE 8080 

CMD ["python", "/app/app.py"] 

3) bewegt, um das nicht-statische app.py an einem geeigneten Ort: Wurzel des Projekts.

4) Führen Sie mit: docker build . -t pyapp, dann docker run -p 8080:8080 -it pyapp

Sie sollten Serving on port 8080... von Terminal-Ausgabe. Und Hello World im Browser.

Ich habe dein Github-Projekt gegabelt und eine pull-request gemacht.


Edit:

Wenn Sie Änderungen benötigen, wenn Sie den Behälter mit einem Volumen entwickeln, führen Sie die App außer Kraft zu setzen, die im Bild gepackt. Zum Beispiel:

docker run -v ./static/js/:/static/js -p 8080:8080 -it pyapp 

können Sie haben so viele Bände wie Sie wollen, aber die App ist bereits im Bild verpackt und bereit, irgendwo zu schieben.

+0

Schnelle Frage: Warum sollten Sie die ganze App in den Container packen? –

+0

Es ist eines der Hauptmerkmale von Docker: Anwendungen in Bilder packen und diese bereitstellen.Wenn Sie Änderungen schnell aktualisieren und aktualisieren müssen, können Sie "docker run" mit einem Volume ausführen. Ich werde es der Antwort hinzufügen – Robert

1

Sie können pdb verwenden, um Python-Code in CLI zu debuggen. Um dies zu erreichen, müssen Sie nur pdb importieren und pdb.set_trace() aufrufen, wo Sie einen Haltepunkt in Ihrem Python-Code haben möchten. Grundsätzlich müssen Sie die folgende Zeile ein, wo Sie einen Haltepunkt wollen:

import pdb; pdb.set_trace() 

Dann müssen Sie Ihre Python-Code interaktiv ausführen.

Sie könnten das tun bash interaktiv in Ihrem Container mit

docker run -it -p 8080:8080 -v ~/Development/my-Docker-builds/pythonReact/statics/:/statics/ ciasto/pythonreact:v2 /bin/bash 

durch Laufen und dann läuft manuell Ihre App mit

[email protected]:/statics/js# python /statics/js/app.py 

Wenn der Code den Haltepunkt erreichen wird, wird es anhalten und ein Es wird eine Eingabeaufforderung angezeigt, in der Sie Befehle eingeben können, um Ihre Ausführung zu überprüfen. Weitere Informationen zu den verfügbaren Befehlen finden Sie unter the pdb commands documentation.


Auch ich stellte fest, dass Sie Ihr Bild bauen mit dem python:3.5-slim Basisbild, das ein (sehr) Licht Python Bild ist, das nicht alle wird allgemein in einer Python-Distribution enthält.

Von the Python images page:

This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run python. Unless you are working in an environment where only the python image will be deployed and you have space constraints, we highly recommend using the default image of this repository.

Vielleicht machen Sie das Standard python:3.5 Bild anstelle Ihr Problem lösen würde.

+0

ok danke ich werde es versuchen. Ich dachte nicht, dass ich einfach in den gleichen Container springen und Debugger verwenden kann. –

+0

eigentlich bin ich mir voll bewusst Debugger, aber was mich stört ist tat die App funktioniert, wenn ich auf Host Mac OS Maschine direkt, aber nicht auf Linux-Container –

+0

folgende Schritte ausführen: Ich bekomme diese Nachricht: 'Default Renderer nicht in Rendern, automatisch Wechsel zu Kajiki App_globals nicht zur Verfügung gestellt und lib.app_globals.Globals ist nicht verfügbar. Helfer nicht zur Verfügung gestellt und lib.helpers ist nicht verfügbar. –

0

Als ein schneller Tipp zum Debuggen von Container-Anwendungen. Wenn Ihre Anwendung fehlschlägt, weil der Container abgestürzt/gestoppt wurde. Starten Sie einfach das Container-Image mit CMD/ENTRYPOINT als /bin/bash, dann starten Sie die Anwendung manuell, sobald Sie die Container-Shell haben, können Sie die Anwendung wie bei einem normalen Linux-System debuggen. CMD ist einfach zu überschreiben wie ENTRYPOINT verwenden Sie einfach --entrypoint Flag mit docker run Befehl.