debugging容器化的Python Web应用程序

我做了第一个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. 

但如果我正常运行这个应用程序 ,即不是直接在我的主机容器:它工作正常。

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

主要是这样的:

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

应该:

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

我已经把你的应用程序和你的“Hello World”

做了这些改变:

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

2)这个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/* 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 build . -t pyapp ,然后docker run -p 8080:8080 -it pyapp

您应该看到Serving on port 8080...输出。 浏览器中的Hello World

我已经分叉你的Github项目,并做了拉请求 。


编辑:

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

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

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

您可以使用pdb在CLI中debuggingPython代码。 为了达到这个目的,你只需要导入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 

当代码到达断点时,它会暂停,并显示一个提示符,你可以在那里input命令来检查你的执行。 有关可用命令的更多详细信息,可以查看pdb命令文档 。


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

从Python图像页面 :

此图像不包含默认标签中包含的常用软件包, 只包含运行python所需的最小软件包 。 除非你在只部署python映像的环境中工作,并且你有空间限制,否则我们强烈build议使用这个仓库的默认映像

也许使用标准的python:3.5图像可以解决你的问题。

作为debugging集装箱应用程序的快速提示。 如果您的应用程序因容器崩溃/停止而失败。 只要用CMD/ENTRYPOINT作为/bin/bash启动容器映像,然后手动启动应用程序,一旦你有容器shell,你可以按照普通的Linux系统debugging应用程序。 CMD很简单,只要使用--entrypoint docker run命令使用--entrypoint标志就可以按照ENTRYPOINT进行覆盖。