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

debugging containerised python web app

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

您可以使用 pdb 在 CLI 中调试 Python 代码。为此,您只需导入 pdb 并调用 pdb.set_trace(),您希望在 Python 代码中设置断点。基本上你必须在你想要断点的地方插入以下行:

import pdb; pdb.set_trace()

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

您可以通过 运行ning 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:

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

主要是这个:

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

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

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