如何在 Docker 容器内调试 Python 和 Django 应用程序
在开发系统时所经历的情绪的过山车是任何一个即使接触很少的人都可以强烈表达的。然而,对于那些在各种项目和应用程序方面拥有丰富经验的人来说,从头开始构建系统通常被认为是梦想的情况。
当您需要维护、支持或发展现有的正在运行的系统时(有时有数千或数百万用户),真正的噩梦就会出现。软件开发中《但丁地狱》的最深一层是当你必须调试代码来解决问题。
我知道有时,尤其是当你刚刚开始时,你依赖于最简单、最非正式的 print() 及其在其他语言中的等效项。 不用担心,我们的秘密在这里是安全的。然而,我们也知道,对于最痛苦、最棘手的 bug,我们需要使用高效、强大、全面的调试工具。
我被要求分析工作中的一些性能问题。使用 Grafana 对函数/类返回或时间跟踪进行浅层调查不足以找到所有混乱代码中的真正问题。那么...让我们调试吧!
调试
在 Python 中,我们有 PDB,一个用于调试代码的简单库。要使用它,您只需使用 pip 安装它。例如:
pip install pdb
然后在要调试的代码中添加一行:
import pdb; pdb.set_trace()
这将是您的断点。现在,您可以再次运行您的应用程序,它将在您刚刚添加的行之后立即暂停执行。然后,您可以逐行、逐个函数地逐步执行代码,以找到您需要解决的问题。
使用 Docker
上面的设置应该足以满足使用 Django、Flask 或 FastAPI 的简单 Python 项目。但是,如果您已经达到这一点并且正在运行您的应用程序在 Docker 容器内,遇到问题,我也遇到过同样的问题。保持冷静,只需按照以下几个步骤操作即可:
1 - 您应该安装远程调试器,而不是通常的PDB。在 Docker 容器内运行它(或将库包含在依赖项管理器中):
pip install remote-pdb
2 - 在 docker-compose.yml 文件中,添加新端口 以公开 PDB 入口点:
... services: your-app: ... ports: - 8000:8000 # already existing port of your application - 4444:4444 # NEW LINE TO EXPOSE PDB PORT ... ...
3 - 仍然在 docker-compose.yml 文件中,添加这两行,以允许从 Docker 外部向正在运行的容器发送命令:
... services: your-app: ... ports: - 8000:8000 - 4444:4444 stdin_open: true # THIS tty: true # AND THIS ... ...
4 - 最后,将代码中的断点行更改为以下行:
__import__("remote_pdb").set_trace(host='0.0.0.0', port=4444)
现在您也可以运行 Docker 映像,并从我们打开的 端口 4444 连接 PDB 调试器,在您最喜欢的终端中使用简单的 telnet 命令:
telnet 0.0.0.0 4444
PDB命令
要巧妙地在代码的海洋中航行,您需要使用 PDB 提供的有用的命令。让我们在这里看看其中的一些:
我通常只使用命令step (s)和next (n)。两者之间的区别在于步骤执行每一行,甚至是在当前行上调用的函数内的那些行。接下来只执行当前函数内的行,等待被调用函数的返回。
其他两个有用的命令是 return (r),执行所有函数直到返回,以及 continue (c),执行所有内容直到下一个断点。
结论
希望本内容对您有所帮助。通过调查一个重大的性能问题并在撰写本文时加强我的学习,我可以保证
“使用正确的工具完成正确的工作”
作为软件开发人员,我们永远不应该忘记这一点。它可以将我们的事业提升到更有效的水平并为这趟过山车之旅带来更多快乐。
以上是如何在 Docker 容器内调试 Python 和 Django 应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Linux终端中查看Python版本时遇到权限问题的解决方法当你在Linux终端中尝试查看Python的版本时,输入python...

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...

在使用Python的pandas库时,如何在两个结构不同的DataFrame之间进行整列复制是一个常见的问题。假设我们有两个Dat...

Uvicorn是如何持续监听HTTP请求的?Uvicorn是一个基于ASGI的轻量级Web服务器,其核心功能之一便是监听HTTP请求并进�...

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

攻克Investing.com的反爬虫策略许多人尝试爬取Investing.com(https://cn.investing.com/news/latest-news)的新闻数据时,常常�...
