【问题标题】:debugging containerised python web app调试容器化的 Python Web 应用程序
【发布时间】:2017-10-28 22:32:21
【问题描述】:

我已经制作了第一个 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 应用程序以了解导致它无法工作的原因。或者我做错了什么。

【问题讨论】:

    标签: python docker wsgi docker-container turbogears2


    【解决方案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 在浏览器中。

    我已经 fork 你的 Github 项目并做了一个pull-request


    编辑:

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

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

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

    【讨论】:

    • 快速提问:为什么要将整个应用打包到容器中?
    • 这是 docker 的主要功能之一:将应用打包成镜像并交付。如果您需要快速开发和更新更改,您可以docker run 与卷。我会把它添加到答案中
    【解决方案2】:

    您可以使用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 图像可以解决您的问题。

    【讨论】:

    • 好的,谢谢,我会试一试。我没想到我可以直接跳到同一个容器中并使用调试器。
    • 实际上我完全了解调试器,但困扰我的是,如果我直接在主机 mac OS 机器上而不是在 Linux 容器上运行,应用程序可以工作
    • 按照您的步骤:我收到此消息:Default renderer not in renders, automatically switching to kajiki app_globals not provided and lib.app_globals.Globals is not available. helpers not provided and lib.helpers is not available.
    • 您正在使用python:3.5-slim 映像作为您的 Dockerfile 基础。你试过标准的python:3.5吗?
    • 尝试过并没有帮助还尝试了 python 3.4,它与渲染 javascript 所需的 dukpy 最兼容和测试。仍然没有工作,但是我在 Debian 4.9.2-10gcc version 4.9.2 上。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 2012-02-09
      • 2016-12-27
      相关资源
      最近更新 更多