我在这里显然不明白。我正在尝试在Docker容器中以交互方式运行pdb
调试器。
以下是一些代码:
Dockerfile:
FROM python:3.6
ENV PROJECT_DIR=/opt/foo
WORKDIR $PROJECT_DIR
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "foo.py"]
foo.py:
def hello_world():
print("hello world")
if __name__ == '__main__':
#import pdb; pdb.set_trace()
hello_world()
如果我先运行docker build -t foo .
然后运行docker run foo
,它会按预期打印出“ hello world”。
但是,如果我取消注释对以上pdb.set_trace()
的呼叫并重试,则会收到以下错误消息:
/opt/foo/foo.py(8)<module>()
-> hello_world()
(Pdb)
Traceback (most recent call last):
File "foo.py", line 8, in <module>
hello_world()
File "foo.py", line 8, in <module>
hello_world()
File "/usr/local/lib/python3.6/bdb.py", line 51, in trace_dispatch
return self.dispatch_line(frame)
File "/usr/local/lib/python3.6/bdb.py", line 70, in dispatch_line
if self.quitting: raise BdbQuit
bdb.BdbQuit
我没有得到什么?
修改: BbdQuit raised when debugging python不是重复的问题。
我的问题,如@soundstripe正确识别的那样,没有在Docker中为pdb提供交互式访问。
答案 0 :(得分:4)
声音条上的提示对我不起作用。但是,您可以打开一个新终端并输入
docker attach [container_name]
现在您应该可以使用pdb。
您可能需要将这些添加到docker-compose yml文件中的服务定义中,以使其正常工作:
stdin_open: true
tty: true
答案 1 :(得分:3)
pdb
需要具有TTY的可用终端。您可以通过告诉Docker使用-it
将容器中的交互式TTY附加到您的终端,从而轻松运行pdb:
docker run -it foo
我通常还会添加--rm
选项来删除我的临时容器。
docker run -it --rm foo
但这并不是总是最好的调试方法,因为完成后容器就消失了。
答案 2 :(得分:0)
添加到乔纳森的答案 - 要在遇到断点时退出 TTY,请按 Ctrl+P,然后按 Ctrl+< kbd>Q。 不要使用Ctrl+C,它会杀死进程。