【问题标题】:How can I connect to python pdb debugger running under docker + supervisord?如何连接到在 docker + supervisord 下运行的 python pdb 调试器?
【发布时间】:2018-07-18 02:16:51
【问题描述】:

我有一个 Python 应用程序(Flask,但这很可能是偶然的),我已经 Docker 化了它(使用 Docker Compose,这又可能是偶然的)。我有除python/flask 以外的进程需要在同一个容器中运行,并且我使用supervisord 进行此操作,因为它很方便。

我在我的代码中设置了一个pdb 断点pdb.set_trace() 并希望连接到我的Flask 应用程序的TTY,以便我可以与(pdb) 提示进行交互。这通常可以正常工作,但我通常不使用supervisord。我无法获得可靠的交互式 (pdb) 提示 - 我的终端似乎连接不正确。

允许调试的通常步骤(通过docker attach)失败了:

告诉docker-compose.yml打开tty并连接stdin:

stdin_open: true
tty: true

告诉docker-compose.yml 设置PYTHONUNBUFFERED

PYTHONUNBUFFERED: 'true'

我的supervisord 进程块是:

[supervisord]
nodaemon=true

[program:flask]
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
command=flask run

如何使用在 Docker 下运行的 pdbsupervisord

【问题讨论】:

    标签: docker docker-compose supervisord pdb


    【解决方案1】:

    为了让它工作,我不得不放弃在-it 模式下运行的容器上通常使用的docker attach 方法...在supervisord 下运行时,这不适用于任何组合。

    我必须做的调试是:

    1. 暂时注释掉我的supervisord.conf 中的所有四 (4) 行 std???_logfile???。通常这些对于将每个进程的输出重定向回docker logs 很有用,但它们会导致pdb 输出的丢失。
    2. 使用supervisorctl 访问Flask 应用程序并与pdb 交互。

    supervisorctl 位详细说明:

    1. 在您的pdb.set_trace() 断点被命中之前或之后,运行docker-compose exec <servicename> supervisorctl,或使用普通的Docker docker exec -it <containername> supervisorctl
    2. supervisor> 提示符下,使用运行 Flask/Python 的进程的进程名运行 fg <processname>
    3. 当你的断点被命中时,你应该得到一个(pdb) 提示。您可能需要发出 (pdb) 命令(例如 l)才能让终端发出提示。
    4. CTRL-Cexit 完成 supervisorctl

    【讨论】:

    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2021-11-29
    • 2021-09-26
    相关资源
    最近更新 更多