调试容器化的python web应用程序

时间:2017-05-28 14:44:05

标签: python docker wsgi docker-container turbogears2

我已经创建了第一个docker容器,它按照Dockerfile

工作
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"]
运行此命令后

  

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

当我打开页面localhost:8080时,我收到错误:

A server error occurred.  Please contact the administrator.

但如果我正常运行this application,即不直接在我的主机上进行容器化:它运行正常。

所以我想知道导致服务器错误的原因。如何调试通过容器运行的python应用程序,以了解导致它无法工作的原因。或者我做错了什么。

3 个答案:

答案 0 :(得分:1)

您可以使用pdb在CLI中调试Python代码。要实现这一点,您只需导入pdb并调用pdb.set_trace(),以便在Python代码中设置断点。基本上,您必须在需要断点的地方插入以下行:

import pdb; pdb.set_trace()

然后你必须以交互方式运行你的Python代码。

您可以通过

在容器中以交互方式运行bash来实现
docker run -it -p 8080:8080 -v ~/Development/my-Docker-builds/pythonReact/statics/:/statics/ ciasto/pythonreact:v2 /bin/bash

然后使用

手动运行您的应用
root@5910f24d0d8a:/statics/js# python /statics/js/app.py

当代码到达断点时,它将暂停并显示一个提示,您可以在其中键入命令以检查执行。 有关可用命令的更多详细信息,您可以查看the pdb commands documentation

另外,我注意到您正在使用python:3.5-slim基本图像构建图像,这是一个(非常)轻微的Python图像,不包括所有图像,通常包含在Python发行版中。

来自the Python images page

  

此图片不包含默认标记中包含的公共包,仅包含运行python所需的最小包。除非您在仅部署python映像并且存在空间限制的环境中工作,否则我们强烈建议您使用此存储库的默认映像

使用标准的python:3.5图片可能会解决您的问题。

答案 1 :(得分:1)

主要是这个:

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

应该是:

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

我已经使用您的“Hello World'

启动并运行您的应用程序

这些改变了吗?

1)提到的config.paths['static_files'] = '/statics'

2)此Dockerfile(删除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)将非静态app.py移动到适当的位置:项目的根目录。

4)使用:docker build . -t pyapp,然后docker run -p 8080:8080 -it pyapp

运行

您应该从终端输出中看到Serving on port 8080...。在浏览器中Hello World

我已经分叉了你的Github项目并做了pull-request

编辑:

如果您在开发时需要进行更改,请使用卷运行容器以覆盖图像中打包的应用程序。例如:

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

您可以拥有任意数量的卷,但该应用已经打包在图像中并准备推送到某个地方。

答案 2 :(得分:0)

作为调试容器化应用程序的快速提示。如果您的应用程序因容器崩溃/停止而失败。只需使用CMD/ENTRYPOINT作为/bin/bash启动容器映像,然后在拥有容器shell后手动启动应用程序,您可以按照正常的Linux系统调试应用程序。 CMD根据ENTRYPOINT直接覆盖,只需使用--entrypoint标记docker run