调试容器化的python网络应用程序

问题描述:

我已经做了第一个码头容器,它的工作原理是按照Dockerfile调试容器化的python网络应用程序

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应用程序,以了解是什么导致它无法工作。或者我做错了什么。

主要做法是:

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

应该是:

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

我已经得到了你的应用,并与您的 'Hello World'

难道这些改变运行:

1)The提到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 

你可以有许多卷,只要你想,但应用程序已经挤满了图像,并准备推动地方。

+0

快速问题:为什么要将整个应用程序打包到容器中? –

+0

这是Docker的主要功能之一:在图像中打包应用程序并提供它们。如果您需要快速开发并更新刷新,您可以使用卷“码头运行”。我会将其添加到答案中 – Robert

您可以使用pdb在CLI中调试Python代码。要实现这一点,您只需导入pdb并致电pdb.set_trace(),您希望在Python代码中有断点。基本上你必须在你想要的断点处插入以下行:

import pdb; pdb.set_trace() 

然后你必须交互地运行你的Python代码。

你可以做到这一点在你的容器

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

运行bash交互,然后用

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

手动运行你的应用程序时的代码将达到断点,它将暂停和提示符会显示在哪里你可以键入命令来检查你的执行。 有关可用命令的更多详细信息,可以查看the pdb commands documentation


另外,我注意到,您使用的是python:3.5-slim基础图像是不包括所有的通常包含在Python发行(非常)光Python的形象塑造你的形象。

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.

也许使用标准python:3.5图像,而不是将解决您的问题。

+0

好的,谢谢我会试试看。我没有想过我可以跳进同一个容器并使用调试器。 –

+0

实际上,我完全了解调试器,但最让我困扰的是如果我直接在主机mac OS机器上运行,而不是在Linux容器 –

+0

上执行以下步骤,则该应用可用:我收到此消息: '默认渲染器不在渲染中,自动切换到kajiki 未提供app_globals,lib.app_globals.Globals不可用。 帮助程序未提供,lib.helpers不可用。“# –

作为调试集装箱应用程序的快速提示。如果您的应用程序因容器崩溃/停止而失败。只需启动CMD/ENTRYPOINT作为/bin/bash的容器映像,然后手动启动应用程序,一旦拥有容器外壳,就可以按照正常的Linux系统调试应用程序。 CMD可以直接覆盖,按ENTRYPOINT只是使用--entrypoint标志与docker run命令。