我有一个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
?
答案 0 :(得分:0)
要使此工作正常进行,我不得不在以-it
模式运行的容器上放弃通常的supervisord
方法……在std???_logfile???
下运行时,此方法不能与任何组合一起使用。
我要做的调试是:
supervisord.conf
中docker logs
行的全部四(4)注释掉。通常,这些方法有助于将每个进程的输出重定向回pdb
,但会导致supervisorctl
输出丢失。pdb
访问Flask应用程序并与supervisorctl
进行交互。详细介绍pdb.set_trace()
:
docker-compose exec <servicename> supervisorctl
断点之前或之后,运行docker exec -it <containername> supervisorctl
或使用普通Docker supervisor>
。fg <processname>
提示符下,使用运行Flask / Python的进程的进程名运行(pdb)
。(pdb)
提示。您可能需要发出l
之类的CTRL-C
命令,以使终端发出提示。exit
后,supervisorctl
和{{1}}。