如何连接到在docker + supervisor下运行的python pdb调试器?

时间:2018-07-18 02:16:52

标签: docker docker-compose supervisord pdb

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

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

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

告诉docker-compose.yml打开tty并连接标准输入:

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和pdb下运行的supervisord

1 个答案:

答案 0 :(得分:0)

要使此工作正常进行,我不得不在以-it模式运行的容器上放弃通常的supervisord方法……在std???_logfile???下运行时,此方法不能与任何组合一起使用。

我要做的调试是:

  1. 暂时将我的supervisord.confdocker logs行的全部四(4)注释掉。通常,这些方法有助于将每个进程的输出重定向回pdb,但会导致supervisorctl输出丢失。
  2. 使用pdb访问Flask应用程序并与supervisorctl进行交互。

详细介绍pdb.set_trace()

  1. 在遇到docker-compose exec <servicename> supervisorctl断点之前或之后,运行docker exec -it <containername> supervisorctl或使用普通Docker supervisor>
  2. fg <processname>提示符下,使用运行Flask / Python的进程的进程名运行(pdb)
  3. 命中断点时,您应该收到(pdb)提示。您可能需要发出l之类的CTRL-C命令,以使终端发出提示。
  4. 完成exit后,
  5. supervisorctl和{{1}}。